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

gen*_*age 9 haskell

说我想定义一个函数

applyTwice :: (Int -> Int) -> Int -> Int
applyTwice f x = case f x of
                   0 -> 0
                   y -> f y
Run Code Online (Sandbox Code Playgroud)

我也可以定义相同的功能

applyTwice f x = g (f x)
  where g 0 = 0
        g y = f y
Run Code Online (Sandbox Code Playgroud)

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

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

bhe*_*ilr 18

当你写一个像这样的函数

g 0 = 0
g y = f y
Run Code Online (Sandbox Code Playgroud)

编译器将其转换为

g x = case x of
    0 -> 0
    y -> f y
Run Code Online (Sandbox Code Playgroud)

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