这个功能很奇怪。我很困惑。
return :: (Monad m) => a -> m a
如果我写回5,我会得到5里面的monad。但是什么类型?类型组只是命名依赖项,而不是类型。 Monad是List,IO ......但这是未定义的monad类型。
答案 0 :(得分:3)
return
是多态的,因此它可以代表多种类型。就像C中的+
被重载以在求和整数和求和浮点数时一样,return
被重载以与任何monad一起工作。
当然,在运行代码时,您需要知道m
对应的类型,以便了解要使用的return
的具体实现。有时你会有明确的类型注释或类型推断,让你知道返回使用的实现
(return 5) :: [Int]
其他时候,你可以“推高”更高的决定。如果编写更大的多态函数,则内部返回使用外部函数中的相同类型。
my_func :: Monad m => a -> m a
my_func x = return x
(my_func 10) :: [Int]
我告诉我的func我正在列表monad上工作,反过来,这使得my_func使用了return
里面的列表monad实现。
最后,如果您没有为编译器留下足够的信息来确定要使用的类型,您将得到一个ambiguou intance编译错误。这与Read
类型类特别相同。 (尝试在ghci中键入x <- readLn
以查看会发生什么......)
答案 1 :(得分:2)
它是多态的。它返回调用任何monad实例的return
实现。它返回的具体数据类型取决于函数。
[1,2,3] >>= \n -> return $ n + 1 -- Gives [2,3,4]
getLine >>= \str -> return $ reverse str -- Gets input and reverses it