2016-07-01 4 views
0

저는 하스켈 언어로 프로그래밍하는 초보자입니다. 나는이 같은 부작용이 하스켈 쓰기 기능,에 관심이 있어요 (교육 목적으로, 또 다른 부작용이있을 수 있습니다) :부작용이있는 함수를 구현하는 방법은 무엇입니까?

-- function foo behaves like random numbers generator 
foo :: Int 
{- foo = some magic -} 
-- It can print True or False 
print $ show (foo /= foo) 

내가 알 수있는 바와 같이, 나는 그런과 모나드의 일부 유형의 인스턴스를 구현해야 동작 (예 : IO Why are side-effects modeled as monads in Haskell?). 그러나 나는이 목적을 위해 간단한 함수 예제를 쓰는 방법을 이해하지 못합니다.

+1

흠, 당신이 우리의 기대 무엇? 이미 모나드를 다루는 법을 배워야 할 필요가 있다고 생각 했으므로 현재 사용중인 하스켈에 대한 소개를 읽으십시오. –

+1

'Int'는 함수의 형식이 아닙니다. 그것은 단지 숫자입니다. – melpomene

+0

난 그냥 그런 행동의 구현을 보여주는 예제를보고 싶습니다. – LmTinyToon

답변

1

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 
+0

System.Random에 대해 알고있다. 나는 단지 그런 행동의 일부 구현을보고 싶다. (교육적인 목적을 위해 또 다른 부작용이있을 수있다.) – LmTinyToon

+0

@ АлександрЛысенко 나는 예제를 추가했다 ... 나는 당신이 정말로 원하는 것을 이해하는지 모르겠다. – chi

+0

부작용이있는 함수를 만들 수있는 자체 모나드를 만들고 싶습니다. – LmTinyToon

관련 문제