Size: a a a

2021 February 28

к

кана in Haskell
чистыми они могут быть, если просто какой-то генератор передавать

type Gen = Int

f :: Gen -> (Int, Gen)
f gen = (fromGen gen, nextGen gen)
 where
   -- тут более интересные функции должны быть
   fromGen gen = gen
   nextGen gen = gen + 1

fs :: State Gen Int
fs = state f


main = do
 gen <- newGen
 pure $ flip evalState gen do
   a <- fs
   b <- fs
   pure (a, b)
источник

к

кана in Haskell
но зачем им быть обязательно только чистыми, они могут и в IO жить
источник

[

[BRM]White Rabbit in Haskell
Мне там птичка нашептывала, что ио в хаскеле тоже чистый т.к. он инкапсулирует внутри себя всю "грязную" работу
источник

к

кана in Haskell
ну так print какой-нибудь чистый, он сам по себе ничего не выводит

а когда попадает в main/unsafePerformIO, то уже как-то выполняется
источник

[

[BRM]White Rabbit in Haskell
Хм.
У меня по кд ощущение, что знаний по базе не хватает. Надо уже как-нибудь заботать книжку по хаскелю и желательно ещё проект накатать чтоб в памяти отложилось
источник

к

кана in Haskell
[BRM]White Rabbit
Хм.
У меня по кд ощущение, что знаний по базе не хватает. Надо уже как-нибудь заботать книжку по хаскелю и желательно ещё проект накатать чтоб в памяти отложилось
{-# LANGUAGE DeriveFunctor #-}

import Control.Monad (ap, liftM)

data MyIO a
 = Pure a
 | Print String (MyIO a)
 | GetLine (String -> MyIO a)
 deriving (Functor)

myPrint :: String -> MyIO ()
myPrint text = Print text (Pure ())

myGetLine :: MyIO String
myGetLine = GetLine Pure

instance Monad MyIO where
 Pure a >>= f = f a
 Print msg next >>= f = Print msg (next >>= f)
 GetLine next >>= f = GetLine (\result -> next result >>= f)

instance Applicative MyIO where
 pure = Pure
 (<*>) = ap

runMyIO :: MyIO a -> IO a
runMyIO (Pure x) = pure x
runMyIO (Print msg next) = putStrLn msg *> runMyIO next
runMyIO (GetLine next) = getLine >>= runMyIO . next

app :: MyIO ()
app = do
 myPrint "enter name:"
 name <- myGetLine
 myPrint ("Hello " <> name <> "!")

main = runMyIO app

-- * Main> main

-- enter name:
-- kana
-- Hello kana!

-- * Main>
источник

к

кана in Haskell
весь app чистый, myPrint ничего не выводит сам по себе
источник

[

[BRM]White Rabbit in Haskell
ну я примерно так и понял
источник

[

[BRM]White Rabbit in Haskell
Кстати, операторы хаскеля играют новыми красками наркомании, если у тебя включены лигатуры
источник

[

[BRM]White Rabbit in Haskell
кана
{-# LANGUAGE DeriveFunctor #-}

import Control.Monad (ap, liftM)

data MyIO a
 = Pure a
 | Print String (MyIO a)
 | GetLine (String -> MyIO a)
 deriving (Functor)

myPrint :: String -> MyIO ()
myPrint text = Print text (Pure ())

myGetLine :: MyIO String
myGetLine = GetLine Pure

instance Monad MyIO where
 Pure a >>= f = f a
 Print msg next >>= f = Print msg (next >>= f)
 GetLine next >>= f = GetLine (\result -> next result >>= f)

instance Applicative MyIO where
 pure = Pure
 (<*>) = ap

runMyIO :: MyIO a -> IO a
runMyIO (Pure x) = pure x
runMyIO (Print msg next) = putStrLn msg *> runMyIO next
runMyIO (GetLine next) = getLine >>= runMyIO . next

app :: MyIO ()
app = do
 myPrint "enter name:"
 name <- myGetLine
 myPrint ("Hello " <> name <> "!")

main = runMyIO app

-- * Main> main

-- enter name:
-- kana
-- Hello kana!

-- * Main>
а Pure тут используется тупо как заглушка для рекурсии?
источник

[

[BRM]White Rabbit in Haskell
И да, я тут вижу, ты ещё больше накинул кода, но я ещё предыдущий вариант не закончил понимать, с новым я  же ебанусь
источник

к

кана in Haskell
не только. У каждой монады должно быть какой-то способ включить в себя чистое значение без эффектов
источник

к

кана in Haskell
[BRM]White Rabbit
И да, я тут вижу, ты ещё больше накинул кода, но я ещё предыдущий вариант не закончил понимать, с новым я  же ебанусь
там то же самое, я просто bind заменил на инстанс монады
источник

[

[BRM]White Rabbit in Haskell
а монады это типа как перечисления в расте?
источник

[

[BRM]White Rabbit in Haskell
хотя... а ты знаешь, как выглядят перечисления в расте?
источник

к

кана in Haskell
монады это буквально функторы, для которых есть pure и тот bind

ну и законы выполняются
источник

к

кана in Haskell
перечисления в расте тут это дата-тип MyIO, он сам по себе не монада

а вот он + pure + bind это монада
источник

к

кана in Haskell
pure это лифт значения в монадный контекст, но без эффекта

эти равенства должны выполняться
m >>= pure = m
pure x >>= f = f x

для этого Pure конструктор там и нужен

а бинд (>>=) что такое ты и сам видел, когда было прямое определение без инстансов
источник

[

[BRM]White Rabbit in Haskell
Мне про функторы один чел в беседке шарпов рассказывал, когда я в программировании ещё только месяца 3 был и даже ООП не до конца понимал и тогда он сказал, что функтор это map, ага. Который ФВП, преобразующая перечисления.
И ЧТО-ТО МНЕ ПОДСКАЗЫВАЕТ, что меня тогда где-то налюбили/что-то не договорили
источник

к

кана in Haskell
а функтор да, это map

f - функтор, если существует такая функция map :: (a -> b) -> (f a -> f b)

и выполняются равенства

map f . map g = map (f . g)
map id = id
источник