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