【问题标题】:How do Haskell currying and pattern matching work together?Haskell 柯里化和模式匹配如何协同工作?
【发布时间】:2012-09-21 10:56:21
【问题描述】:

我是 Haskell 的新手。我知道函数被柯里化为带有一个参数的函数。我不明白在这种情况下如何实现对多个值的模式匹配。例如:

假设我们有以下完全任意的函数定义:

myFunc :: Int -> Int -> Int
myFunc 0 0 = 0
myFunc 1 1 = 1
myFunc x y = x `someoperation` y

本质上是myFunc 0返回的部分应用函数吗:

partiallyAppliedMyFunc :: Int -> Int
partiallyAppliedMyFunc 0 = 0
partiallyAppliedMyFunc y = 0 `someoperation` y

从而删除不可能匹配的无关模式?或者....这是怎么回事?

【问题讨论】:

    标签: haskell pattern-matching currying


    【解决方案1】:

    实际上,这个问题比表面上看起来要微妙得多,并且需要学习一点编译器内部知识才能真正正确回答。原因是我们有点理所当然地认为我们可以拥有多个术语的嵌套模式和模式,而实际上,对于编译器而言,您唯一能做的就是在单个的顶级构造函数上分支价值。所以编译器的第一阶段是将嵌套模式(以及超过一个值的模式)转换为更简单的模式。例如,一个简单的算法可能会将你的函数转换成这样的:

    myFunc = \x y -> case x of
        0 -> case y of
            0 -> 0
            _ -> x `someoperation` y
        1 -> case y of
            1 -> 1
            _ -> x `someoperation` y
        _ -> x `someoperation` y
    

    您已经可以看到这里有很多次优的东西:someoperation 术语重复了很多次,并且函数在开始执行 case 之前就需要两个参数;请参阅 A Term Pattern-Match Compiler Inspired by Finite Automata Theory 讨论如何改进这一点。

    无论如何,在这种形式下,实际上应该更清楚地了解柯里化步骤是如何发生的。我们可以直接替换这个表达式中的x,看看myFunc 0做了什么:

    myFunc 0 = \y -> case 0 of
        0 -> case y of
            0 -> 0
            _ -> 0 `someoperation` y
        1 -> case y of
            1 -> 1
            _ -> 0 `someoperation` y
        _ -> 0 `someoperation` y
    

    由于这仍然是一个 lambda,因此没有进一步减少。你可能希望一个足够聪明的编译器能做更多的事情,但 GHC 明确地没有做更多的事情;如果您希望在仅提供一个参数后完成更多计算,则必须更改定义。 (这里有时间/空间的权衡,正确选择太难做到可靠。所以 GHC 把它留给程序员来做这个选择。)例如,你可以明确地写

    myFunc 0 = \y -> case y of
        0 -> 0
        _ -> 0 `someoperation` y
    myFunc 1 = \y -> case y of
        1 -> 1
        _ -> 1 `someoperation` y
    myFunc x = \y -> x `someoperation` y
    

    然后myFunc 0 将简化为一个更小的表达式。

    【讨论】:

    • 酷,感谢您的清晰解释!令人欣慰的是,我似乎走在了正确的轨道上,尽管我没有意识到编译器没有采取额外的步骤来清理无关的匹配案例。那篇论文也是一个很好的资源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 2019-01-28
    相关资源
    最近更新 更多