适用的仿函数纯匹配不包裹

时间:2016-07-23 15:49:50

标签: haskell applicative

我正在学习应用仿函数。在应用Maybe的{​​{3}}中,pure函数如下所示:

instance Applicative Maybe where
    pure = Just
    ...etc

随着参数的扩展,我认为它看起来像:

pure x = Just x

当我致电pure (Just 5)时,会返回Just 5

不应该返回Just (Just 5)吗?

同样,对于source

instance Applicative [] where  
    pure x = [x]

当我致电pure [4,5,6]时,它会返回[4,5,6]

从签名中看,pure [4,5,6]应该返回[[4,5,6]]

有人可以用简单的语言解释这里发生了什么吗?

等等,我想我得到了 - 因为没有提供上下文,pure [4,5,6]没有使用Applicative List,它只是使用一般情况并返回相同的值。这是对的吗?

1 个答案:

答案 0 :(得分:6)

pure是一个重载函数。它需要任何类型a的值,并将其包装到应用程序仿函数f中。

ghci> :t pure
pure :: Applicative f => a -> f a

f由上下文决定。如果您将pure x传递给期望Maybe的函数,则类型检查器将推断f ~ Maybe并选择Maybe的{​​{1}}实例, Applicative将评估为pure x。同样,如果您将Just x传递给列表函数,则类型检查器将使用pure x的{​​{1}}实例,[]将返回单例列表。

Applicative

在你的情况下,我猜你在GHCI提示符下输入pure x。如果您没有提供任何上下文(例如将列表函数应用于ghci> :t map map :: (a -> b) -> [a] -> [b] -- map is a list function ghci> map (+1) (pure 4) -- so when we pass in (pure 4) [5] -- it means a singleton list ),GHCI将默认假设您打算使用pure x的{​​{1}}实例,{ {1}}是无效的pure x操作,返回IO。然后GHCI尽职尽责地执行Applicative行动。

pure x

如果类型检查器无法根据您的代码查看上下文,您可以使用类型注释手动声明上下文。

IO