Обновить
59

Пользователь

22
Подписчики
Отправить сообщение
Супер, спасибо!
Да, странновато. Куда логичнее выделять CAF'ы, ибо они
can either be compiled to a piece of graph which will be shared by all uses or to some shared code which will overwrite itself with some graph the first time it is evaluated

Но они при этом вовсе не обязаны иметь тип не функции.
Тогда функция, это просто (->) (с аргументами, разумеется, так как сама стрелка имеет kind * -> * -> *), а всё остальное — не функция.

Т.е. это не функция:
Maybe (a -> b) -- == Maybe ((->) a b)

Зато это — функция:
a -> Maybe b -- == (->) a (Maybe b)


Есть ещё расширение UnicodeSyntax, и base-unicode-symbols, и можно писать так:
foo ∷ Functor f ⇒ (b → c) → (a → b) → f a → f c
foo f g = fmap (f ∘ g)

Я лично ввожу их в SublimeText с дополнением UnicodeMath
Что такое «конкретное значение» в данном контексте?
Не понял пример 4, а если так, то она станет оператором?

(!#$%&*+./<=>?@\^|-~:) :: Int -> Int -> (Int -> Int) -- Функция с тремя параметрами
(!#$%&*+./<=>?@\^|-~:) a b = \c -> a + b + c

А системы типов без вывода типов всегда простые?
А почему система типов хаскеля «довольно простая»?
Нет, состояние — частный случай монады, чуть выше я привел комментарий с примерами. Но если говорить конкретно о IO, то IO так и определён, как функция, принимающая старое состояние, и возвращающая новое + какой-то результат:
newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))

IO является при этом монадой, но не всякая монада — IO.
Чтобы быть монадою (в Haskell), для типа должны быть определены операции (также удовлетворяющие некоторым законам):
return :: a -> m a -- 
(>>=) :: m a -> (a -> m b) -> m b

Что позволяет использовать в применении к этому типу синтаксический сахар do, например, или просто набор библиотечных монадических функций.

Например, в C# — LINQ — аналог монады, может быть реализован для разных типов. В Scala, насколько я знаю, это for с его for (x < — ...; y < — ...). Там тоже надо реализовать пару функций и можно использовать в for любой тип.
Нет, монадическая функция, это функция оперирующая монадою. Она вовсе не обязана менять какое-то состояние или иметь к ним хоть какое-то отношение, так как монада — не о состояниях, это более общий случай. Например replicateM — монадическая функция, и, к примеру
ghci> replicateM 3 (putStrLn "Hello")
Hello
Hello
Hello
[(),(),()]

или
ghci> execState (replicateM 3 (modify (+1))) 0
3

однако
ghci> replicateM 3 [1,2]
[[1,1,1],[1,1,2],[1,2,1],[1,2,2],[2,1,1],[2,1,2],[2,2,1],[2,2,2]]

И никакого состояния в последнем случае нет, ибо монада тут списочная, а не монада состояния или IO, как в примерах выше.
Собственно hackage.haskell.org/package/ghc-prim-0.3.1.0/docs/src/GHC-Types.html#IO
newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))
> в Хаскелле нет функции генерации псевдослучайного числа без аргументов?
Нету, если не считать unsafePerformIO, бо IO a таки принимает аргументы
Я ошибся, foo(x++, x++) — таки undefined, конечно. Unspecified: foo(inc(x), inc(x))
foo(x++, x++), емнип, unspecified behavior, а не undefined, а вот пример выше таки undefined
Это вы к тому, что сначала надо иммунитет поднимать, а уж потом разрешать обратно?
Добавлю, что исходный мой комментарий был шуточным с учётом того, что CLion я не пользовался и ничего относительно конкретно него сказать не могу.

Информация

В рейтинге
Не участвует
Откуда
Россия
Дата рождения
Зарегистрирован
Активность