我正在学习应用仿函数。在应用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
,它只是使用一般情况并返回相同的值。这是对的吗?
答案 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