解释haskell函数类型时缺少括号

解释haskell函数类型时缺少括号,haskell,Haskell,刚接触haskell时,我觉得:t缺少括号,无法正确理解函数类型 像这个: Prelude> :info flip flip :: (a -> b -> c) -> b -> a -> c -- Defined in ‘GHC.Base’ 我可以这样说:flip通过如下括号接受一个函数并返回另一个函数: flip :: (a -> b -> c) -> (b -> a -> c) 或者我可以说,flip接受一个函数,b和

刚接触haskell时,我觉得
:t
缺少括号,无法正确理解函数类型

像这个:

Prelude> :info flip
flip :: (a -> b -> c) -> b -> a -> c    -- Defined in ‘GHC.Base’
我可以这样说:
flip
通过如下括号接受一个函数并返回另一个函数:

flip :: (a -> b -> c) -> (b -> a -> c)
或者我可以说,
flip
接受一个函数,
b
a
并返回元素
c


对于相当多的函数类型,我有这种感觉,我想一定有一些规则来消除这种歧义

事实上,这不是歧义,而是特性

以加号运算符(+)为例。它有类型

(+)::Num a=>a->a->a
你可以把它看作一个函数,它接受两个数字,然后返回第三个

number 
       \
          ----> number
       /
number
你这样用这个-

 (+) 1 2 (-- evaluates to 3)
 or
 1 + 2 (-- evaluates to 3)
或者,您可以将其用作

(+)::Num a=>a->(a->a)
它接受一个数字,并输出一个完整的函数,其域和范围都是一个数字,即
numa=>a->a

number ------> <function>
其中,
incrementorFunc
是将一个数字相加的函数(即
incrementorFunc=\x->1+x

现在,您可以将此函数传递给代码中的其他地方使用


这种二元性是所有函数固有的,因此类型描述中不需要括号。此功能是Haskell最大的优势之一。

事实上,这并不是含糊不清,而是一个功能

以加号运算符(+)为例。它有类型

(+)::Num a=>a->a->a
你可以把它看作一个函数,它接受两个数字,然后返回第三个

number 
       \
          ----> number
       /
number
你这样用这个-

 (+) 1 2 (-- evaluates to 3)
 or
 1 + 2 (-- evaluates to 3)
或者,您可以将其用作

(+)::Num a=>a->(a->a)
它接受一个数字,并输出一个完整的函数,其域和范围都是一个数字,即
numa=>a->a

number ------> <function>
其中,
incrementorFunc
是将一个数字相加的函数(即
incrementorFunc=\x->1+x

现在,您可以将此函数传递给代码中的其他地方使用


这种二元性是所有函数固有的,因此类型描述中不需要括号。此功能是Haskell最大的优点之一。

您不需要括号,因为两者之间没有区别

纯粹主义者会说,所有Haskell函数只接受一个参数。没有多参数函数。例如:

map f [1..10]
被解释为:

(map f) [1..10]
i、 例如,
map
与参数
f
一起应用,结果与参数
[1..10]
一起应用


正是这种解释使得自动咖喱在Haskell中起作用。从某种意义上说,咖喱是哈斯克尔的一种错觉,即我们看到
map f
,我们看到
map
的咖喱形式,因为只有一个参数。实际上
map
只接受一个参数,因此
map f
完全适用。

不需要括号,因为两者之间没有区别

纯粹主义者会说,所有Haskell函数只接受一个参数。没有多参数函数。例如:

map f [1..10]
被解释为:

(map f) [1..10]
i、 例如,
map
与参数
f
一起应用,结果与参数
[1..10]
一起应用


正是这种解释使得自动咖喱在Haskell中起作用。从某种意义上说,咖喱是哈斯克尔的一种错觉,即我们看到
map f
,我们看到
map
的咖喱形式,因为只有一个参数。实际上
map
只接受一个参数,因此
map f
完全适用。

不确定
Num a=>(a->a)->a是什么意思。你的意思是
numa=>(a,a)->a
,它就是这样的…@luqui-你说得对,我太马虎了。。。。你对我的基本意思是正确的。给我几秒钟,我会改写部分内容。我不确定你所说的
numa=>(a->a)->a
是什么意思。你的意思是
numa=>(a,a)->a
,它就是这样的…@luqui-你说得对,我太马虎了。。。。你对我的基本意思是正确的。给我几秒钟,我会改写部分内容。你的问题到底是什么?你的问题到底是什么?