什么是"什么都没有"的类型签名?

abe*_*008 0 monads haskell

Real World Haskell(Monads)的第14章中,inject函数的类型签名returnreturn :: 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 IntegerMaybe 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)


awe*_*oon 7

和...之间的不同:

*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)