【发布时间】:2011-12-28 07:32:36
【问题描述】:
我对 Haskell 如何分派到类型类中的正确函数有点困惑。这是隐式完成的,还是与 Haskell 如何推断某物的类型有关?例如,考虑以下内容:
instance Monad Parser where
return a = Parser (\ cs -> [(a, cs)])
如果我这样做:
return something >>= \x -> -- Returning a parser!
haskell 是否使用绑定的右侧猜测哪个返回调用?它如何知道调用 Parser 返回而不是其他一些?
编辑:
好的,所以这实际上给我提出了更多问题。我知道 Haskell 如何通过解决类型声明来推断“返回”应该是什么。但是,如果是完全模棱两可的陈述呢?
例如,如果我打开解释器并输入return 1 会怎样?那么它怎么知道调用哪个返回呢?
【问题讨论】:
-
GHCi 语句对于某些 a 首先被假定为
IO a类型,然后执行(如果失败,它会尝试print it,其中 it 是你输入的表达式),所以由于return 1适合(Num a) => IO a类型,所以它被执行;Num实例是使用 Haskell 的默认机制选择的(它将是整数)。 -
let x :: (Monad m, Num n) => m n; x = return 1看看,x是一个多态值!它可以在任何情况下使用,只要情况需要一个类型为m n的值并符合约束条件:m是Monad,n是Num。x可能是[1.0] :: [Double],Just 1 :: Maybe Int... 各种各样的东西!