- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试用多种语言对“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/
我想知道是否可以在haskell中使用守卫内部的守卫。像这样: analyser modele instr | instr == NoCom = (modele, "No command" ,
我正在尝试在 Windows 7 上将 Guard 与适用于 Chrome 的 LiveReload 插件一起使用。它不起作用,我不知道如何解决这个问题。我使用 Bash 启动防护,然后在浏览器中激活
我有以下代码。我正在检查 3 个条件。您可以看到,对于第一个条件,我将 xml:get_tag_attr_s(...) 的输出存储在变量中,然后在 if block 中使用该变量。我的问题是,如果我尝
是否有类似于自动测试的 ctrl+c 强制运行所有规范的东西?我仍在努力微调我的 .Guardfile,但目前我可以在不重新启动 guard 的情况下强制运行所有规范吗? ctrl+c 退出守卫。 最
我刚刚在 Angular 大学完成了关于 Angular 2 和 Firebase 的 Angular 2 类(class)。 讲师 Vasco (@angular-university) 提出 Ro
我正在使用 guard-zeus我的应用程序中的 gem gem 的行为符合预期,但控制台的输出全部失真。 看起来像是添加了额外的制表符,所以这些行没有按应有的方式断开 有人知道如何解决这个问题吗?
有人可以解释 Xcode 中这些选项的作用吗? 启用涂鸦 启用防护边缘 启用Guard Malloc 它们是什么、它们做什么以及它们对调试/测试有多大用处? 谢谢。 最佳答案 来自documentat
我关注了 "How I Test" screencast at RailsCasts ,但是我遇到了 spork 的问题 $ guard Guard is now watching at '/User
以下代码被mix视为错误: case test do ... t when !is_list(t) -> false ... end 错误是“防护中的表达式无效,防
我知道可以像这样使用 guard 语句 guard let someConstant = someOptional() else { // ... } 我试着去做 struct MyStruc
我按照 Michael Hartl 的 Rails 教程使用 Spork 运行 Guard,我遇到了这个问题。以下是错误信息: 20:45:58 - INFO - Starting Spork for
尝试在我的 ubuntu 机器上安装 Guard,但是当我尝试从命令行运行它时出现此错误: No command 'guard' found, did you mean: Command 'guar
我是 Laravel 的新手。我正在浏览默认的身份验证中间件,我看到它正在使用: Auth::guard($guard)->guest() 检查用户是否是访客。 文档位于 https://larave
我正在通过 Ruby on Rails 教程(Michael Hartl)学习 RoR。 现在我尝试使用 Guard 运行测试。 我的 gem 文件: source 'https://rubygems
请帮我解决这个问题 我想使用多重身份验证。 我的 Laravel 版本是 5.2.* (5.2.29) 文档中写的我都做 //congig/auth.php [ 'guard' => 'we
Guard-RSpec 在自述文件中提到可以通过指定自定义 cmd 使用 spring 运行规范: guard :rspec, cmd: 'spring rspec' do # ... end 这
Guard-RSpec 在自述文件中提到可以通过指定自定义 cmd 使用 spring 运行规范: guard :rspec, cmd: 'spring rspec' do # ... end 这
一 点睛 当线程在访问某个对象时,发现条件不满足,就暂时挂起等待条件满足时再次访问,这就是 Guarded Suspension 设计模式。该设计模式的关注点在于临界值的条件是否满足,当达到设置的临界
我正在制作一个步骤向导,并试图阻止用户导航到即将到来的页面路由,除非他们导航到这些步骤,但允许他们导航到之前的页面/步骤。 我目前的解决方案是为每个页面/步骤指定一个步骤编号,但它不允许导航到前面的步
其他stackoverflow-ers, 我目前正在学习 Erlang。 有人可以指出我为什么会收到 illegal guard expression用这个守卫? add_new_prime(Idx,
我是一名优秀的程序员,十分优秀!