gpt4 book ai didi

haskell - 哪个 Haskell 构造/语句等同于 C++ 的 "switch"?是 "guards"还是 "case of"?

转载 作者:行者123 更新时间:2023-12-05 09:29:58 25 4
gpt4 key购买 nike

我正在尝试用多种语言对“switch”语句与“if-else if”语句进行基准测试,看看哪个结构的执行速度最快。我在大学里接受过“切换”更快的培训。

那么我关于 Haskell 的问题是:哪个 Haskell 构造/语句等同于 C++ 的“开关”?是“守卫”还是“案件”?

最佳答案

tl;dr 没有真正的等价物,但是 switch 最容易翻译成 case,而 if 最容易用守卫翻译。

大多数情况下,切换是在没有任何专用结构的情况下完成的,而只是使用多个函数子句。

f :: Char -> String

...
f 'k' = "kay"
f 'l' = "el"
f 'm' = "em"
...

实际上 GHC 在内部将其转换为 case 表达式,

f c = case c of
...
'k' -> "kay"
'l' -> "el"
'm' -> "em"
...

当然,所有这些,就像 Haskell 的所有一样,都是纯函数式的。它不像 C++ 中的 switch 那样工作,后者都是关于副作用的。

...但是 Haskell 也可以产生副作用,只是,它们不是语句,而是合适的 monadic 类型的表达式。 case 因此甚至可以用于命令式切换。

main :: IO ()
main = do
putStrLn "Hi, what's your name?"
userName <- getLine
case words useName of
[singleName] -> do
putStrLn "Select if this is your first (F) or last (L) name."
nameKind <- getLine
...
[firstName, lastName] -> do
putStrLn "You entered you full name, thanks."

Haskell 的 if 最直接对应于 C++ 的 ?: 三元运算符,而不是它的 if 结构。但同样,这可以用于表达式和命令式流,因为在 Haskell 中一切都是表达式。

main = do
putStrLn "Hi, what's your name?"
userName <- getLine
if length (words useName) == 2
then putStrLn "You entered you full name, thanks."
else error "Please enter both first and last name."

请注意,else 是必需的。

if 实际上在 Haskell 中并不经常使用;当有多个不同的条件时,守卫会更优雅。

没有 else(“if cond then do this stuff, else just continue”)的 C++ if 最接近的模拟是 when ,它不是关键字,而只是库中定义的组合器。

关于haskell - 哪个 Haskell 构造/语句等同于 C++ 的 "switch"?是 "guards"还是 "case of"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70155048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com