我可以毫无问题地理解这一行代码
let f s = filter (isDigit.head) (groupBy (on (==) isDigit) s)
当我打电话给f "123abc345"
时,它返回["123", "345"]
但是我很难理解为什么下面的代码行是相同的
let g = filter (isDigit.head) . groupBy (on (==) isDigit)
此作品如何运作?非常感谢你!
答案 0 :(得分:2)
函数组合运算符.
的定义如下:
(.) f g = \x -> f (g x)
或者,同样的东西以infix形式出现:
f . g = \x -> f (g x)
用英语可以这样表示:两个函数f
和g
的组成是另一个接受参数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
现在让我们看看这里发生了什么。 f
取s
,将其馈送到groupByDigit
,然后将其结果馈送到whereFirstIsDigit
。但是,(例如)x . y
的函数组成被定义为将其输入馈送到y
,然后将该结果馈送到x
的函数!所以这两个功能是相同的。