gpt4 book ai didi

haskell - Haskell 中的无积分

转载 作者:行者123 更新时间:2023-12-03 13:38:56 25 4
gpt4 key购买 nike

我有这段代码,我想让它变得无意义;
(\k t -> chr $ a + flip mod 26 (ord k + ord t -2*a))
我怎么做?

除了“想想这个amd想出什么”之外,还有一些关于无点风格的一般规则吗?

最佳答案

开启一个功能

func x y z = (some expression in x, y and z)

变成无点形式,我一般会尝试按照对最后一个参数 z 所做的操作并将函数写为
func x y z = (some function pipeline built using x and y) z

然后我可以取消 z s 得到
func x y = (some function pipeline built using x and y)

然后对 y 和 x 重复该过程应该以 func 结束。以无点形式。在此过程中要识别的一个基本转换是:
    f z = foo $ bar z    -- or f z = foo (bar z)
<=> f z = foo . bar $ z
<=> f = foo . bar

同样重要的是要记住,通过部分评估,您可以“中断”函数的最后一个参数:
foo $ bar x y == foo . bar x $ y    -- foo applied to ((bar x) applied to y)

对于您的特定功能,请考虑 k 的流程和 t经过:
  • 申请 ord给他们每个人
  • 添加结果
  • 减去 2*a
  • 取结果 mod 26
  • 添加
  • 申请 chr

  • 因此,作为简化的第一次尝试,我们得到:
    func k t = chr . (+a) . (`mod` 26) . subtract (2*a) $ ord k + ord t

    请注意,您可以避免 flip通过使用 mod 上的部分,以及使用 - 的部分在 Haskell 中变得凌乱,所以有一个 subtract函数(它们与写负数的语法冲突: (-2) 表示负 2,与 subtract 2 不同)。

    在这个函数中, ord k + ord t非常适合使用 Data.Function.on ( link)。这个有用的组合器让我们可以替换 ord k + ord t将函数应用于 kt :
    func k t = chr . (+a) . (`mod` 26) . subtract (2*a) $ ((+) `on` ord) k t

    我们现在非常接近拥有
    func k t = (function pipeline) k t

    因此
    func = (function pipeline)

    不幸的是,在用一系列一元函数组合二元函数时,Haskell 有点困惑,但有一个技巧(我会看看能否找到一个好的引用),我们最终得到:
    import Data.Function (on)

    func = ((chr . (+a) . (`mod` 26) . subtract (2*a)) .) . ((+) `on` ord)

    这几乎是一个很好的整洁的无点函数管道,除了那个丑陋的组合技巧。通过定义 .:运算符(operator)在评论中建议 on this page ,这稍微整理一下:
    import Data.Function (on)

    (.:) = (.).(.)

    func = (chr . (+a) . (`mod` 26) . subtract (2*a)) .: ((+) `on` ord)

    为了进一步完善这一点,您可以添加一些辅助函数来将字母 <-> Int 转换与 Caesar cipher 分开。算术。例如: letterToInt = subtract a . ord

    关于haskell - Haskell 中的无积分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2464406/

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