我有一个简单的函数:
func :: Int
func = do
x <- 1
return x
但是我收到一条错误消息,如下所示:
Couldn't match type ‘m0 b0’ with ‘Int’
我的函数出了什么问题?
你的代码有两个问题:
-
<-
的右侧必须具有类型m a
其中a
是任意类型(然后成为左侧的类型),m
是 do-block 所属的 monad。在您的情况下,右侧的类型是1
,它没有该类型。如果只想将一个值绑定到
x
,则需要使用let x = 1
,而不是<-
。 -
return
的类型是Monad m => a -> m a
,所以如果我们取Int
x
的类型,return x
的类型是Monad m => m Int
。但是根据您的类型签名,您只希望类型是Int
,而不是m Int
。因此,您不应该使用return
(或为此do
-notation)。
您尝试编写的定义的正确方法是:
f = 1
或者如果您想拥有本地x
f =
let x = 1 in
x
或
f = x
where x = 1