繁体   English   中英

在Haskell中使用多重模式缩短函数定义

[英]Shortening function definitions using multine patterns in haskell

这样做更好吗?

charToAction 'q' = Just $ WalkRight False
charToAction 'd' = Just $ WalkRight True
charToAction 'z' = Just Jump
charToAction _ = Nothing

要么

charToAction x = case x of
    'q' -> Just $ WalkRight False
    'd' -> Just $ WalkRight True
    'z' -> Just Jump
    _ -> Nothing

绝对没有功能上的差异。 这是个人喜好问题。

没有性能差异, 因为第一个定义不如第二个定义。 您正确地选择了案例+模式匹配解决方案,而不是带有警卫和相等性测试的解决方案,这里有一些出色的一般说明: http : //existentialtype.wordpress.com/2011/03/15/boolean-blindness/ (他的示例在ML中,但立即翻译为Haskell)。

请注意,您在第二个定义中误用了otherwise 你应该只写_ -> Nothing这不是otherwise所使用守卫,你可能也已经写fmap -> Nothing和同样会发生。

正如其他人提到的那样,生成的代码没有什么区别,因为前一种方法与后一种方法有所不同,但是我可以指出一些其他考虑因素,这些因素可以帮助您选择一种或另一种使用:

  1. 前一种方法在某些情况下看起来更漂亮(尽管我个人认为,一旦您遇到很多情况,就会分心)
  2. 前一种方法使重构名称稍微困难一些。 使用case语句,函数名称仅出现一次。
  3. Case语句可以在代码中的任何位置使用,也可以匿名使用。 前一种方法需要使用letwhere块在函数中定义模式匹配函数。

但是,在任何情况下都无法将一个翻译成另一个。 这完全是编码风格的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM