我正在阅读这里,我注意到如果我有以下函数定义:
a :: Integer->Integer->Integer
b :: Integer->Bool
以下表达式是无效的:
(b . a) 2 3
很奇怪的是,组合函数的功能必须只有一个参数。
这个限制是因为在Haskell中定义最通用的函数时存在一些问题,还是因为其他原因呢?
我是Haskell的新手,所以也许问了一些无用的问题。
我正在阅读这里,我注意到如果我有以下函数定义:
a :: Integer->Integer->Integer
b :: Integer->Bool
(b . a) 2 3
很奇怪的是,组合函数的功能必须只有一个参数。
这个限制是因为在Haskell中定义最通用的函数时存在一些问题,还是因为其他原因呢?
我是Haskell的新手,所以也许问了一些无用的问题。
a 2 3
时,你并不是将 a
应用于两个参数。实际上,你是将 a
应用于它唯一的参数,生成一个函数,然后将该函数应用于 3。因此,你实际上进行了两次应用。所以在某种程度上,你所拥有的不等同于这个:a :: (Integer, Integer) -> Integer
b :: Integer -> Integer
(b . a) (2, 3)
(b . a 2) 3
(b . a 1 2) 3
。关键是由a
产生的“东西”必须在b
的域内(或者粗略地说,是相同类型的)。 - Phila
和b
。我们是组合a 1 2
和b
,只是为了明确。 - Phila
和b
函数,并将前者进行“uncurry(反柯里化)”处理。(b . uncurry a) (2, 3)
- Dan Burton