Tha*_*Don 5 haskell functional-programming
Learn You a Haskell的一个例子是:
pure (+) <*> Just 3 <*> Just 5
他说:
所以起初,我们有
pure (+),这是Just (+)
我假设Haskell在<*>函数上使用类型推断来确定pureLHS上的函数将是来自类型类Maybe实例的函数Applicative(基于我们在Just 5RHS上使用的事实,并且Just是a Maybe).
但是,是有过,你有你想使用变成一个适用函子的值的情况下pure的方法,但你不打算通过使用它的时候了<*>功能,因此哈斯克尔无法确定哪个pure函数来使用?如果是这样,您将如何明确说明pure要使用哪个函数?
或者,在某些上下文中使用pure函数的结果之前,Haskell不会尝试确定哪个函数pure(例如在某个时候将它提供给<*>函数时)
ehi*_*ird 11
你会给它一个类型注释.如果您将其定义为变量,则可以使用顶级类型签名:
foo :: Maybe (Integer -> Integer -> Integer)
foo = pure (+)
Run Code Online (Sandbox Code Playgroud)
(这也适用于let和where条款.)
或者如果你在表达式中使用它,你就会写(pure (+) :: Maybe (Integer -> Integer -> Integer)).
您还可以获得相关pure功能,而无需将其应用于参数.既然我们有:
pure :: (Applicative f) => a -> f a
Run Code Online (Sandbox Code Playgroud)
...我们可以说(pure :: a -> Maybe a)得到一个pure理想的类型.但是(pure :: a -> Maybe a) (+)比起来更令人困惑pure (+) :: Maybe (Integer -> Integer -> Integer),所以后者在一般情况下可能更有用.
但是,您的问题的最后一句是正确的:您可以pure (+)在没有类型签名的情况下分配给变量,稍后在特定的具体类型(例如Maybe (Integer -> Integer -> Integer))中使用它,而不必使用任何类型的注释.(有轻微的限制:如果你把它定义为没有任何类型的签字顶级变量,那么你只能把它作为一个特定的类型,而不是两个不同的地方,由于单态限制 ......但你可能不要不用担心.)