在Real World Haskell(Monads)的第14章中,inject函数的类型签名return是return :: a -> m a,其中m a是一个类型构造函数,因此在ghci下我可以为a指定类型签名return arg1,例如:
*Main> return 1 :: Maybe Integer
Just 1
*Main> return "ok" :: Maybe String
Just "ok"
Run Code Online (Sandbox Code Playgroud)
因为Nothing是类型的值Maybe a,Nothing"S型Maybe Integer或Maybe String,所以我想我可以指定如下类型:
*Main> return Nothing :: Maybe String
Run Code Online (Sandbox Code Playgroud)
但是我收到了一个错误:
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
Run Code Online (Sandbox Code Playgroud)
我很困惑什么是类型签名.
chi*_*chi 11
在线
return 1
return "ok"
Run Code Online (Sandbox Code Playgroud)
monad return里面的作品Maybe,所以return = Just在这里.
在线
return Nothing :: Maybe String
Run Code Online (Sandbox Code Playgroud)
编译器发现你的代码是表单的
return ... :: Maybe ...
Run Code Online (Sandbox Code Playgroud)
所以,再次,return = Just.你的代码相当于
Just Nothing :: Maybe String
Run Code Online (Sandbox Code Playgroud)
这是一样的
Just (Nothing :: String)
Run Code Online (Sandbox Code Playgroud)
但Nothing不是字符串,它是Maybe a任何a- 因此类型错误.
你可能正在寻找
Nothing :: Maybe String -- no return here
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.
顺便说一句,您可以要求GHCi使用以下:t命令为表达式提供类型:
> :t return Nothing
Monad m => m (Maybe a)
Run Code Online (Sandbox Code Playgroud)
和...之间的不同:
*Main> return 1 :: Maybe Integer
Run Code Online (Sandbox Code Playgroud)
和
*Main> return Nothing :: Maybe String
Run Code Online (Sandbox Code Playgroud)
这1有类型Integer,但Nothing有类型Maybe a.如果要包装Nothing到另一个Maybe值,则应指定Nothing类似的类型:
*Main> return Nothing :: Maybe (Maybe String)
Just Nothing
Run Code Online (Sandbox Code Playgroud)