Haskell 显式确定要使用哪个纯函数

Haskell 显式确定要使用哪个纯函数,haskell,functional-programming,Haskell,Functional Programming,其中一个例子是: pure(+)仅3仅5 他说: 首先,我们有pure(+),也就是Just(+) 我假设Haskell正在对函数使用类型推断,以确定LHS上的纯函数将是Applicative类型类的Maybe实例中的函数(基于我们在RHS上仅使用5,并且Just是Maybe) 但是,是否有过这样的情况:您希望使用pure方法将某个值转换为应用程序函子,但您不会立即通过函数使用它,因此Haskell无法确定要使用哪个pure函数?如果是这样,您将如何明确说明要使用哪个纯函数 或者,在这种情况下,

其中一个例子是:

pure(+)仅3仅5

他说:

首先,我们有
pure(+)
,也就是
Just(+)

我假设Haskell正在对
函数使用类型推断,以确定LHS上的
函数将是
Applicative
类型类的
Maybe
实例中的函数(基于我们在RHS上仅使用
5
,并且
Just
Maybe

但是,是否有过这样的情况:您希望使用
pure
方法将某个值转换为应用程序函子,但您不会立即通过
函数使用它,因此Haskell无法确定要使用哪个
pure
函数?如果是这样,您将如何明确说明要使用哪个
函数


或者,在这种情况下,Haskell不会尝试确定哪个
pure
函数,直到
pure
函数的结果在某些上下文中使用(例如,当您在某个点将其馈送给
函数时)

您会给它一个类型注释。如果将其定义为变量,则应使用顶级类型签名:

foo :: Maybe (Integer -> Integer -> Integer)
foo = pure (+)
(这也适用于
let
where
子句。)

或者,如果您在表达式中使用它,您将编写
(纯(+)::可能(Integer->Integer->Integer))

您还可以获得相关的
pure
函数,而无需将其应用于参数。由于我们:

pure :: (Applicative f) => a -> f a
…我们可以说
(pure::a->Maybe a)
来获得所需类型的
pure
。但是
(pure::a->maybea a)(+)
pure(+)::maybead(Integer->Integer->Integer)
更容易混淆,因此后者通常可能更有用


但是,问题的最后一句是正确的:您可以将
pure(+)
赋值给一个没有类型签名的变量,然后在特定的具体类型上使用它(例如
Maybe(Integer->Integer->Integer)
),而不必使用任何类型注释。(有一个小小的限制:如果您将其定义为没有任何类型签名的顶级变量,那么您只能将其作为一个特定类型使用,而不是在不同的位置使用,因为……但您可能不需要担心这一点。)

这是一个类型推断问题。问题文本的最后一段也是正确的:通常,如果您还不能决定使用一个具体的应用程序函子,您也不必这样做。无需立即选择具体类型,您可以定义在应用程序函子中重载的派生代码。