使用案例与函数进行模式匹配

时间:2014-08-23 04:27:36

标签: haskell

我想要定义一个函数

applyTwice :: (Int -> Int) -> Int -> Int
applyTwice f x = case f x of
                   0 -> 0
                   y -> f y

我也可以定义与

相同的功能
applyTwice f x = g (f x)
  where g 0 = 0
        g y = f y

那些都会做同样的事情,也许有时候其中一个或更有可读性,但两者之间是否有任何真正的区别。另一个只是一个语法糖吗?是否存在奇怪的情况,其中一个有效但另一个无效?

我能想到的唯一可能的差异是,在第二个函数中,如果我感觉它可以给出ga类型签名,并且如果我想模式匹配多个变量,使用辅助函数可能会使我从嵌套的case语句中保存

1 个答案:

答案 0 :(得分:17)

编写类似

的函数时
g 0 = 0
g y = f y

编译器将其转换为

g x = case x of
    0 -> 0
    y -> f y

您可以通过使用ghc -ddump-simpl my_file.hs进行编译然后挖掘生成的核心来检查这一点。实际上,模式匹配只是案例陈述的语法糖。使用你认为最具可读性的两者都是非常标准的。