【问题标题】:How To with Partial Function Application in Haskell如何在 Haskell 中使用偏函数
【发布时间】:2026-01-30 01:10:01
【问题描述】:

我正在尝试使用部分应用来缩短以下有效函数定义:

ltest50 n = take 50 (iterate ltestonce n)

我的想法是这样的:

ltest50 = take 50 (iterate ltestonce)

ltest50 = take 50 (iterate ltestonce$)

会做的伎俩,但没有乐趣。在 Haskell 中执行此操作的最佳方法是什么?

【问题讨论】:

  • 您可能想知道这里有一个 haskell wiki page

标签: haskell currying partial-application


【解决方案1】:

Haskell 有“点运算符”或“函数组合(.) :: (b -> c) -> (a -> b) -> a -> c 用于此:

ltest50 n = take 50 (iterate ltestonce n)

相当于:

ltest50 = take 50 . iterate ltestonce

(.) 定义为:

(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g x = f (g x)

或者更短一点:

(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g x = f $ g x

因为它是一个放在括号之间的符号,这意味着它可以用作.作为中缀运算符,所以:

ltest50 = take 50 . iterate ltestonce

是“语法糖”,用于:

ltest50 = (.) (take 50) (iterate ltestonce)

至少在法兰德斯(比利时的荷兰部分),运算符有时被非正式地称为“之后”,因为您在对变量应用 g 之后应用 f

【讨论】: