2015-01-05 3 views
0

, return 같은 I은 return arg1하는 타입의 서명을 지정할 수 ghci하에 있도록 m a이 타입 생성자이다 return :: a -> m a, 상기 분사 기능 유형 서명 :"return Nothing"의 유형 서명은 무엇입니까? <a href="http://book.realworldhaskell.org/read/monads.html" rel="nofollow">the chapter 14 of Real World Haskell (Monads)</a>에서

*Main> return 1 :: Maybe Integer 
Just 1 

*Main> return "ok" :: Maybe String 
Just "ok" 

때문에 Nothing가있다 유형 Maybe a의 값은 Nothing의 유형은 Maybe Integer 또는 Maybe String, 그래서 다음과 같이 내가 유형을 지정할 수 있다고 생각 :

*Main> return Nothing :: Maybe String 

하지만 오류가 발생했습니다.

Couldn't match type `Maybe a0' with `[Char]' 
Expected type: String 
    Actual type: Maybe a0 
In the first argument of `return', namely `Nothing' 
In the expression: return Nothing :: Maybe String 
In an equation for `it': it = return Nothing :: Maybe String 

그 유형 서명이 무엇인지 혼란 스럽습니다.

+2

, 당신은 * 반환 할 필요가 없습니다 * 아무것도하는 DO 블록의 끝에서 '아무것도 없다. ' do do nothing은 유효합니다. – mb14

+0

당신은'fail '의 줄을 따라 더 많은 것을 찾고있을 것입니다. err은 인간 ":: 아마 t"이고, 결과는'Nothing'입니다. – AJFarmar

답변

7

의 차이 :

*Main> return 1 :: Maybe Integer 

그리고

*Main> return Nothing :: Maybe String 

1Integer을 입력 가지고 있다는 것입니다,하지만 NothingMaybe a을 입력있다. 다른 Maybe 값으로 Nothing을 포장하려는 경우, 당신은이 같은 Nothing의 유형을 지정해야합니다 : 여기 그래서 라인

return 1 
return "ok" 

Maybe 모나드 내부의 return 작품에서

*Main> return Nothing :: Maybe (Maybe String) 
Just Nothing 
11

, return = Just을. 라인

return Nothing :: Maybe String 

코드 그래서 다시 한 번 형태

return ... :: Maybe ... 

이다 컴파일러 관광 명소, return = Just에서

. 따라서 유형의 오류 - 코드는

Just (Nothing :: String) 

하지만 Nothing와 같은, 그것은 어떤 a에 대한 Maybe a 문자열되어 있지 않으며 어떤

Just Nothing :: Maybe String 

에 해당합니다.

당신은 아마 잘 작동

Nothing :: Maybe String -- no return here 

를 찾고 있습니다

.

그런데

, 당신은 :t 명령으로 표현 유형을 제공하기 위해 GHCi를 요청할 수 있습니다 : 보통

> :t return Nothing 
Monad m => m (Maybe a) 
+0

저는 개인적으로 마지막 표현식을'Monad m => m (아마도 a)'로 typecheck 할 것입니다. 나는 GHCi가 유추하는 곳 (m ~ 아마) – Ingo

관련 문제