일부 하위 식에 대해 유형이 무엇인지 GHC에 문의하겠습니다.
> :t putStrLn . show
putStrLn . show :: (Show a) => a -> IO()
확실히 예상대로입니다.
> :t return 5 >>= f >>= f
return 5 >>= f >>= f :: [Int]
우리가 예상 했겠지만 귀하의 질문에 대답하지 않습니다. 다음으로, 그 표현이 구문 분석 방법에 대한 빠른 알림 :
> :i (>>=)
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
...
infixl 1 >>=
좋아, 그것은 연관을 왼쪽, 그래서 표현은 (return 5 >>= f) >>= f
입니다.
> :t return 5 >>= f
return 5 >>= f :: [Int]
(>>=)
에 대해 위의 유형 서명이 비교, 우리는 두 가지를 관찰 할 수있다 :
(>>=)
의 첫 번째 인수해야이
(>>=)
의 두 번째 인수는 모나드의 일종을 반환해야 동일한 모나드의 값
따라서 f
은 e (a -> m b)
여기에 f
에 대한 실제 유형 서명은 Int -> [Int]
입니다.그래서 우리는 수동으로 유형을 결합 할 수 있습니다 : ([] a)
가 [a]
과 같은 일을 의미
하는 것으로.
그래서 모나드는 실제로 모나드입니다. 무슨 일 이니?
> return 5 :: ([] Int)
[5]
> [5] >>= f
[6, 10]
> ([5] >>= f) >>= f
[7, 12, 11, 20]
답을 고맙습니다. 이제 어떻게 작동하는지 이해했습니다. 모나드에 대해 배울 점이 많은 것처럼 보입니다. – jijesh