为什么Haskell会内置“ if / then / else”,而不是将其定义为简单的库函数?


25

为什么Haskell具有一个if/then/else依赖于Bool类型的内置而不是简单的库函数?如

if :: Bool -> a -> a -> a
if True  x _ = x
if False _ y = y

4
我猜想他们明确地想要if / then / else语法,如果没有像agda中那样的mixfix函数,他们将无法获得它们。您所指的功能是三元结构,您可以实现自己,尽管我假设他们给了我们if / then / else糖(很可能只是一个案例中的糖),只是因为它们可以并且无害。.但是我一无所有在这里支持我,这就是为什么我在评论中写这个。
Jimmy Hoffa 2013年

10
对于大多数读者来说,这也许是显而易见的,但是我想指出的是,将îf/ then / else作为函数使用热切的语言(例如scheme或sml)并不是一个好的解决方案,尽管这在懒惰中是合理的。像Haskell这样的语言。
Giorgio 2013年

Answers:


24

这是纯粹的的漂亮的糖ifthenelse关键词; 实际上,GHC(RebindableSyntax启用扩展名)将通过简单地调用ifThenElse范围内的任何函数来对语法进行解糖。


6

没关系...对我来说,看起来/如果/然后/其他现在不经常使用。我发现自己写的是..那么..否则..的模式后卫。

但是,从语法角度来看,

if expr1 then expr2 else expr3

所以你可以写

if foo a then bar b else baz c

代替

if (foo a) (bar b) (baz c)

在我看来,这有点太讨厌了。

对于语义分析和代码生成,最好有这种结构,可以轻松地将其编译为有效的机器代码。请注意,与函数调用(必须传递所有(未赋值的)参数)相反,该代码可以跳过未实现分支的部分,而不是通过调用。但这也要花费时间(和内存,必须稍后回收)来创建进程。为了做到这一点,必须在所有地方都插入if函数。


3
我认为内联不是实际问题。我的理解是,GHC已经非常擅长内联小函数,因为它只是Haskell中的一种常见模式。
Tikhon Jelvis

1
@TikhonJelvis当然可以,但是使用if / then / else不需要特殊的功能,而该功能必须始终内联。您甚至不需要内联通行证,仍然可以生成不错的代码。并非全世界都是GHC。
Ingo 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.