foo
이 실제로 일부 RNG처럼 작동하는 경우 일부 모나드 유형이 있거나 RNG의 상태를 추가 입력으로 받아야합니다.
여기합니다 (IO 모나드에 살고) 시스템 RNG를 사용하는 예이다 :
import System.Random
foo :: IO Int
foo = randomRIO (1,5) -- random number between 1 and 5
main :: IO()
main = do
x <- foo
y <- foo
print $ x /= y
main
에서, 우리는 단순히 두 번 foo
전화 유형 Int
이있는, x,y
에 그 결과를 바인딩. 그런 다음 평소대로 비교할 수 있습니다.
foo :: IO Int
은 int를 반환하는 동작이므로 사용할 수 없으며 작업을 비교할 수는 없으며 정수와 같은 기본 데이터 만 비교할 수 있습니다. 이것이 우리가 먼저 행동을 실행 한 다음 그 결과를 비교하는 이유입니다.
main
좀 더 고급 콤비
main = print =<< ((/=) <$> foo <*> foo)
-- or
main = print =<< liftA2 (/=) foo foo
을 악용 한 줄에 쓸 수도 있지만 처음에 이들에 초점을하지 않을 것입니다.
사이드 effecful 계산의 일반적인 예 :
foo :: IORef String -> IO Int
foo s = do
x <- readIORef s -- reading a "variable"
print x -- output
w <- getLine -- input
writeIORef s ("qwerty" ++ x) -- writing a variable
length <$> readIORef s
main :: IO()
main = do
s <- newIORef "dummy"
print =<< foo s
출처
2016-07-01 08:41:10
chi
흠, 당신이 우리의 기대 무엇? 이미 모나드를 다루는 법을 배워야 할 필요가 있다고 생각 했으므로 현재 사용중인 하스켈에 대한 소개를 읽으십시오. –
'Int'는 함수의 형식이 아닙니다. 그것은 단지 숫자입니다. – melpomene
난 그냥 그런 행동의 구현을 보여주는 예제를보고 싶습니다. – LmTinyToon