1

这样做更好吗:

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

?

4

3 回答 3

8

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

于 2012-06-24T16:28:38.067 回答
2

没有性能差异,因为第一个定义对第二个定义脱糖。您更喜欢案例+模式匹配解决方案而不是带有保护和相等测试的解决方案是正确的,这里有一些出色的一般性评论:http: //existentialtype.wordpress.com/2011/03/15/boolean-blindness/(他的例子在 ML 中,但立即转换为 Haskell)。

请注意,您otherwise在第二个定义中误用了;你应该写_ -> Nothing这不是otherwise你正在使用的守卫,你也可以写fmap -> Nothing,同样的事情也会发生。

于 2012-06-24T19:08:54.957 回答
1

正如其他人所提到的,生成的代码没有区别,因为前一种方法对后一种方法没有糖分,但是我可以指出一些其他考虑因素,可以帮助您选择使用其中一个或另一个:

  1. 前一种方法在某些情况下看起来更漂亮(尽管我个人认为一旦你有很多案例就会分散注意力)
  2. 前一种方法使重构名称稍微困难一些。使用 case 语句,函数的名称只出现一次。
  3. Case 语句可以在代码中的任何地方使用,并且可以匿名使用。前一种方法需要使用letorwhere块在函数中定义模式匹配函数。

但是,没有任何情况下您不能将一种翻译成另一种。这完全是编码风格的问题。

于 2012-06-24T22:27:49.533 回答