需要帮助以了解此功能组合的工作原理

时间:2019-03-02 23:12:19

标签: haskell function-composition

我可以毫无问题地理解这一行代码

let f s = filter (isDigit.head) (groupBy (on (==) isDigit) s)

当我打电话给f "123abc345"时,它返回["123", "345"]

但是我很难理解为什么下面的代码行是相同的

let g = filter (isDigit.head) . groupBy (on (==) isDigit)

此作品如何运作?非常感谢你!

2 个答案:

答案 0 :(得分:2)

函数组合运算符.的定义如下:

(.) f g = \x -> f (g x)

或者,同样的东西以infix形式出现:

f . g = \x -> f (g x)

用英语可以这样表示:两个函数fg的组成是另一个接受参数x并将其传递给函数{{1 }},然后将g的返回值传递给函数g

如果您查看第一个代码段:

f

如果您的斜视够用力,您会发现它是一个函数,它接受参数let f s = filter (isDigit.head) (groupBy (on (==) isDigit) s) ,将其传递给函数s,然后将返回值传递给函数groupBy (on (==) isDigit)

根据我上面的解释,这可以表示为两个功能的组合-filter (isDigit.head)filter (isDigit.head),这就是第二个片段。

答案 1 :(得分:1)

首先,您的代码供参考:

let f s = filter (isDigit.head)  (groupBy (on (==) isDigit) s)
let g   = filter (isDigit.head) . groupBy (on (==) isDigit)

(我将其略微格式化以强调相似之处。)

为了帮助我们,现在让我们为您定义中的函数定义一些同义词:

let whereFirstIsDigit = filter (isDigit.head)
let groupByDigit      = groupBy (on (==) isDigit))

现在我们可以按如下方式重写原始功能:

let f s = whereFirstIsDigit  (groupByDigit s)
let g   = whereFirstIsDigit . groupByDigit

现在让我们看看这里发生了什么。 fs,将其馈送到groupByDigit,然后将其结果馈送到whereFirstIsDigit。但是,(例如)x . y的函数组成被定义为将其输入馈送到y,然后将该结果馈送到x的函数!所以这两个功能是相同的。