gpt4 book ai didi

haskell - Haskell 中的 Pointfree 函数 - 将参数转换为列表

转载 作者:行者123 更新时间:2023-12-01 23:27:21 25 4
gpt4 key购买 nike

我正在以无点风格查看 Haskell 中的一些函数。在尝试重写一些简单的示例时,我卡在了这个上

func a b c d = sum $ take 2 $ sort [a, b, c, d]

如何将参数转换成列表形式,这样我就不需要在左边写 a b c 了?

最佳答案

评论里有人提到了awesome

((((((sum . take 2) .) . sort) .) .) .) . (. ((. ((. return) . (:))) . (.) . (:))) . (.) . (.) . (:)

函数。

根据 http://pointfree.io

((((sum . take 2 . sort) .) .) .) . (. ((. ((. return) . (:))) . (.) . (:))) . (.) . (.) . (:)

也是正确的。

你不相信我吗?

好的

让我们减少第二个选项(在我看来它看起来更好)

(((((sum . take 2 . sort) .) .) .) . (. ((. ((. return) . (:))) . (.) . (:))) . (.) . (.) . (:) ) a b c d

将其应用于a:

((((((sum . take 2 . sort) .) .) .) ((. ((. ((. return) . (:))) . (.) . (:))) ((.) ((.) ((:) a))))) ) b c d

Ensugar 运算符:

((((((sum . take 2 . sort) .) .) .) ((. ((. ((. return) . (:))) . (.) . (:))) (((a:).).))) ) b c d

应用部分应用的合成:

((((sum . take 2 . sort) .) .) . ((. ((. ((. return) . (:))) . (.) . (:))) (((a:).).))) b c d

将其应用于 b:

((((sum . take 2 . sort) .) .) (((. ((. ((. return) . (:))) . (.) . (:))) (((a:).).)) b)) c d

通过应用部分应用的 计算将应用于 b 的函数。:

((((sum . take 2 . sort) .) .) ( (((a:).).) . ((. ((. return) . (:))) . (.) . (:)) $ b)) c d)

解析合成:

((((sum . take 2 . sort) .) .) ( (((a:).).) (((. ((. return) . (:))) . (.) . (:)) b))) c d

应用于b:

((((sum . take 2 . sort) .) .) ( (((a:).).) ((. ((. return) . (:))) ((b:) .)))) c d

应用组合(2x):

(((sum . take 2 . sort) .) . ((((a:).).) (( ((b:) .) . ((. return) . (:)))))) c d

应用于 c 并解析组合:

((sum . take 2 . sort) .) (((((a:).).) (( ((b:) .) . ((. return) . (:))))) c) d

应用部分应用的合成:

((sum . take 2 . sort) .) (((((a:).) . (( ((b:) .) . ((. return) . (:)))))) c) d

应用于 c 并解析组合:

((sum . take 2 . sort) .) (((a:).) ((( ((b:) .) . ((. return) . (:)))) c)) d

应用于 c 并解析组合:

((sum . take 2 . sort) .) (((a:).) (((b:) .) (((. return) . (:)) c))) d

解析合成:

((sum . take 2 . sort) .) ((a:) . (((b:) .) (((. return) . (:)) c))) d

应用部分应用的合成:

((sum . take 2 . sort) . ((a:) . (((b:) .) (((. return) . (:)) c)))) d

解析合成:

(sum . take 2 . sort) (((a:) . (((b:) .) (((. return) . (:)) c))) d)

应用于 d 并解析组合:

(sum . take 2 . sort) ((a:) ((((b:) .) (((. return) . (:)) c)) d))

应用部分应用的合成:

(sum . take 2 . sort) ((a:) (((b:) . (((. return) . (:)) c)) d))

应用于 d 并解析组合:

(sum . take 2 . sort) ((a:) (((b:) ((((. return) . (:)) c) d))))

应用于 c 并解析组合:

(sum . take 2 . sort) ((a:) (((b:) (((((c:). return))) d))))

应用于 d 并解析组合:

(sum . take 2 . sort) ((a:) ((b:) ((c:) (return d))))

转换为中缀运算符并解析return

(sum . take 2 . sort) (a : (b : (c : (d : []))))

吸糖

(sum . take 2 . sort) [a, b, c, d]

解析组合并使用$运算符

sum $ take 2 $ sort $ [a, b, c, d]

我们是 hell !如果将其粘贴到带有彩虹括号的编辑器中,将更易于阅读。


如您所见,并非所有内容在无点形式下都会看起来更优雅。有时它非常重要,不仅要理解为什么该函数起作用,而且要理解什么它甚至会做什么,这可能会让人非常困惑。请注意,此函数是特定于长度的——如果您尝试以这种方式创建更大的列表,它会变得更大。

另一方面,我经常使用 http://pointfree.io检查我的功能链是否可以用更简单的方式表达。他们的关键是找到中庸之道——在某些情况下,这种形式会有所帮助,但有时它不仅会变得“无点”,而且会变成“无点”符号。

关于haskell - Haskell 中的 Pointfree 函数 - 将参数转换为列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54845781/

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