什么monadic类型返回返回功能

时间:2014-06-05 23:15:33

标签: haskell

这个功能很奇怪。我很困惑。

return :: (Monad m) => a -> m a

如果我写回5,我会得到5里面的monad。但是什么类型?类型组只是命名依赖项,而不是类型。 Monad是List,IO ......但这是未定义的monad类型。

2 个答案:

答案 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