Ilya
не могу найти, откуда должно следовать именно такое поведение
Ilya
т.е. если я реализую Enum для своего численного типа, то я обязан обеспечить такое же поведение?
Alexander
и.к. 0<-1
Oleg
Alexander
это синтаксис enumFromThenTo
Alexander
enumFromThenTo 0 0 -1 должен быть пустып
Ilya
Alexander
вообще неясно что тут удивительного
Alexander
по определению, например
Ilya
какое определение?
Alexander
выдаём элементы пока current<=final
Alexander
а 0 больше -1
Alexander
так что все, перестали выдавать
Ilya
Alexander
отличное
Ilya
только оно не работает на [-1, -2 .. -10]
Ilya
которое прекрасно раскрывается в [-1,-2,-3,-4,-5,-6,-7,-8,-9,-10], а не должно — если принять твоё опредление
Alexander
там ещё учитывается то в какую сторону идем
Oleg
Ilya
Alexander
если Delta меньше или больше равно нулю
Alexander
2 случая
Ilya
получается, что положительная сторона почему-то лучше отрицательной
Alexander
вообще открыть определение указанной функции очень просто
Ilya
почему [0,0.. 1] == бесконечный список нулей, но [0,0.. -1] == [] ?
Alexander
почему бы и нет
Ilya
как бы 0 - 0 == 0 то есть никакое конкретное направление не задано
Ilya
но семнтика получается разной в зависимости от конца
Oleg
efdtInt x1 x2 y
| isTrue# (x2 >=# x1) = efdtIntUp x1 x2 y
| otherwise = efdtIntDn x1 x2 y
Alexander
-# NOINLINE [1] eftInt #-} eftInt :: Int# -> Int# -> [Int] -- [x1..x2] eftInt x0 y | isTrue# (x0 ># y) = [] | otherwise = go x0 where go x = I# x : if isTrue# (x ==# y) then [] else go (x +# 1#)
Alexander
про такое же поведение смотришь на законы в тайп классе
Alexander
про этот метод там ничего не сказано, так что по твоему желанию
Alexander
на месте программиста я бы не огорчился ни от какой из реализаций
Alexander
даже от того что enumFromThenTo a a b выдало бы error
Ilya
ладно, нашёл Haskell Report, вроде бы там недвусмысленно
The sequence enumFromThenTo e1 e2 e3 is the list [e1,e1+i,e1+2i,...e3], where the increment, i, is e2-e1. If the increment is positive or zero, the list terminates when the next element would be greater than e3; the list is empty if e1 > e3. If the increment is negative, the list terminates when the next element would be less than e3; the list is empty if e1 < e3.
Ilya
просто на хакадже этого нет, поэтому и были сомнения
anton
Сталкивались ли вы с таким и как решали?
ghc: panic! (the 'impossible' happened)
(GHC version 8.4.2 for x86_64-unknown-linux):
Prelude.!!: index too large
Please report this as a GHC bug: http://www.haskell.org/ghc/reportabug
Denis
Смотрим тикеты в траке, если нет - репортим.
anton
я нашёл причину, но к сож не могу миним пример состряпать..
anton
помогло поменять
succ . fromEnum
на
(+1) . fromEnum
anton
я вывел весь код из либы, он небольшой получился, но в изолированом примере, там всё ок
anton
причём если указать типы явно в связке succ . fromEnum , то всё равно panic impossible hapened Prelude.!!
Ruslan
Ruslan
вся моя жизнь - ложь
Ruslan
а я-то людям заливал, что вот есть на свете языки, в которых нельзя передать в функцию объект аргументом и там с ним наделать чего попало
Ю ли я? 🤔
Что-то туплю на ночь глядя. Есть ФРП-шный аппликативный Behavior [a], можно его превратить в [Behavior a]?
Зигохистоморфный
Зигохистоморфный
не думаю что можно так просто взять и перевести асинхронные данные в синхронные
ну или попробуй sequence но я думаю это работать не будет
Ю ли я? 🤔
sequence наоборот делает
Зигохистоморфный
Зигохистоморфный
хотя есть и дуализм для Traversable
https://www.stackage.org/haddock/lts-11.5/distributive-0.5.3/Data-Distributive.html#t:Distributive
Ю ли я? 🤔
WAT
sequenceA :: (Traversable t, Applicative f) => t (f a) -> f (t a)
Ю ли я? 🤔
Хм, это бы пригодилось, но я не представляю, как сделать инстанс для абстрактного типа из чужой либы, не форкая её :(
Зигохистоморфный
Ю ли я? 🤔
Derive для кастомного класса?
Ю ли я? 🤔
map (\i -> fmap (!! i) mylist) [0.. n - 1]
Nikolay
Приветы всем. Обьясните плиз
let f1 x y = flip (,) x y
let f2 p = uncurry f1 p
c f1 понятно у нее нее 2 параметра
а вот с записью f2 не совсем понятно.
я бы ожилал, что запись uncurry f1 p читается как вычислить f1 на p
и на результате вычислить uncurry
т.е
let f2 p = uncurry (f1 p)
но по факту же
let f2 p = (uncurry f1) p
Aleksei (astynax)
f x y == (f x) y, да
Aleksei (astynax)
Все функции всегда принимают аргументы по одному
Aleksei (astynax)
Если имеется вызов функции - набор чего-то через пробелы. То первый элемент и будет вызываемой функцией, а остальные будут скармливаться по одному оной
Aleksei (astynax)
Всё как в лиспе, только нет скобок внешних
Aleksei (astynax)
В лиспе же никто не ожидает, что (f x y) это (f (x y))
Aliester
в лиспе каррирования нет
Aleksei (astynax)
Всегда можно сделать такой интерпретатор, который смогёт :)
Nikolay
а почему вот такая запись не верная let f x = sin . cos x
Nikolay
вот смотрю на композицию
Nikolay
(.) :: (b -> c) -> (a -> b) -> a -> c — Defined in `GHC.Base'
infixr 9 .
Nikolay
у нее 9й приоритет
Nikolay
я бы ожидал, что будет sin от косинуса и это вычисляется на x
Nikolay
а если записать let f = sin . cos , то все работает
Aleksei (astynax)
Композиция имеет меньший приоритет, чем применение функции
Aleksei (astynax)
Поэтому композицию применяют так sin . cos $ x или так (sin . cos) x
Aleksei (astynax)
приоритет у композиции меньше, чем у применения функций, для того, чтобы было удобно писать так:
pipeline = zipWith [1..] . filter (> 5) . map (* 10)
Nikolay
если приоритет меньше, то сначала вызовется map (* 10) ?
Aleksei (astynax)
Да. Сначала применятся все функции, потом скомпозятся результаты
Cheese
Aleksei (astynax)
"будет применена" ;Р