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

最初の定義が2番目の定義に脱糖するため、パフォーマンスの違いはありません。ガードと同等性テストを備えたソリューションよりもケース+パターンマッチングソリューションを好むのは正しいことでした。いくつかの優れた一般的な意見はここにあります:http://existentialtype.wordpress.com/2011/03/15/boolean-blindness/(彼の例MLにありますが、すぐにHaskellに変換されます)。

otherwise2番目の定義で誤用していることに注意してください。あなたはただ書くべきです_ -> Nothingそれはotherwiseあなたが使っている警備員のものではありません、あなたも書くことができたfmap -> Nothingでしょう、そして同じことが起こったでしょう。

于 2012-06-24T19:08:54.957 に答える
1

他の人が述べたように、前者のアプローチは後者のアプローチに脱糖するため、生成されたコードに違いはありませんが、使用するものを選択するのに役立つ可能性のある他の考慮事項をいくつか指摘できます。

  1. 前者のアプローチは、状況によってはよりきれいに見えます(ただし、個人的には、多くの場合があると気が散ることになると思います)
  2. 前者のアプローチでは、名前のリファクタリングが少し難しくなります。caseステートメントを使用すると、関数の名前は1回だけ表示されます。
  3. Caseステートメントは、コード内のどこでも使用でき、匿名で使用できます。前者のアプローチでは、関数内でパターンマッチング関数を定義するためにletまたはブロックを使用する必要があります。where

ただし、一方を他方に翻訳できない場合はありません。それは完全にコーディングスタイルの問題です。

于 2012-06-24T22:27:49.533 に答える