我想要定义一个函数
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语句中保存
答案 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
进行编译然后挖掘生成的核心来检查这一点。实际上,模式匹配只是案例陈述的语法糖。使用你认为最具可读性的两者都是非常标准的。