gpt4 book ai didi

haskell - 为什么这个函数的pointfree版本看起来像这样?

转载 作者:行者123 更新时间:2023-12-03 23:07:59 29 4
gpt4 key购买 nike

我一直在玩 Haskell,包括练习以无点形式编写函数。这是一个示例函数:

dotProduct :: (Num a) => [a] -> [a] -> a
dotProduct xs ys = sum (zipWith (*) xs ys)

我想以无点形式编写此函数。这是我在其他地方找到的一个例子:
dotProduct = (sum .) . zipWith (*)

但是,我不明白为什么无点形式看起来像 (sum .) . zipWith (*)而不是 sum . zipWith (*) .为什么 sum 在括号中并且有 2 个组合运算符?

最佳答案

dotProduct xs ys = sum (zipWith (*) xs ys)             -- # definition

dotProduct xs = \ys -> sum (zipWith (*) xs ys) -- # f x = g <=> f = \x -> g
= \ys -> (sum . (zipWith (*) xs)) ys -- # f (g x) == (f . g) x
= sum . (zipWith (*) xs) -- # \x -> f x == f
= sum . zipWith (*) xs -- # Precedence rule

dotProduct = \xs -> sum . zipWith (*) xs -- # f x = g <=> f = \x -> g
= \xs -> (sum .) (zipWith (*) xs) -- # f * g == (f *) g
= \xs -> ((sum .) . zipWith (*)) xs -- # f (g x) == (f . g) x
= (sum .) . zipWith (*) -- # \x -> f x == f
(sum .)是一个部分。它被定义为
(sum .) f = sum . f

任何二元运算符都可以这样写,例如 map (7 -) [1,2,3] == [7-1, 7-2, 7-3] .

关于haskell - 为什么这个函数的pointfree版本看起来像这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3123762/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com