【发布时间】:2011-04-28 15:29:19
【问题描述】:
普通函数组合的类型
(.) :: (b -> c) -> (a -> b) -> a -> c
我认为这应该概括为以下类型:
(.) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
一个具体的例子:计算差异平方。我们可以写diffsq a b = (a - b) ^ 2,但感觉我应该能够编写(-) 和(^2) 来写diffsq = (^2) . (-) 之类的东西。
我当然不能。我可以做的一件事是使用一个元组而不是(-) 的两个参数,通过使用uncurry 对其进行转换,但这不一样。
有可能做我想做的事吗?如果不是,我有什么误解让我认为它应该是可能的?
注意:这实际上已经被问到here,但没有给出答案(我怀疑必须存在)。
【问题讨论】:
-
您拥有的组合子是
blackbird :: (c -> d) -> (a -> b -> c) -> a -> -> b -> d。您可以将其视为将post-transformer应用于常规函数应用程序。 -
很好的问题,因为它突出了数学和 Haskell 中的函数组合之间的细微差别,这可能会令人困惑。对于这个例子,我更喜欢使用
uncurry (-)的解决方案,因为它比替代方案更简单,并且指向潜在问题。
标签: haskell function-composition pointfree