1

以下は、私が再現した例です。

charName :: Char -> String
charName 'a' = "Albert"
charName 'b' = "Broseph"
charName 'c' = "Cecil"
charName x = "未定義"

上記のコードを以下のようにさらに変更できますか (コンパイルされません)。

charName :: Char -> String
charName 'a' or 'A' = "Albert"
charName 'b' or 'B' = "Broseph"
charName 'c' or 'C' = "Cecil"
charName x or X= "Notまだ定義されていません」

charName 'a' または charName 'A' が指定された場合に "Albert" を取得するには。

上記のコードを最短で書く方法を教えてください。

4

4 に答える 4

5

別のオプションは次のとおりです。

charName :: Char -> String
charName ch 
 | ch `elem` "aA" = "Albert"
 | ch `elem` "bB" = "Broseph"
 | ch `elem` "cC" = "Cecil"
 | otherwise = "Not defined yet" 
于 2012-06-29T07:05:48.577 に答える
4

Mihai の回答と同様に、case ステートメントを使用できます。これにより、追加の関数を定義することなくパターン マッチを行うことができます。

import Data.Char (toLower)

charName :: Char -> String
charName c = case toLower c of
              'a' -> "Albert"
              'b' -> "Broseph"
              _   -> "Not defined yet"
于 2012-06-29T08:17:02.280 に答える
3

toLowerfromData.Charと関数合成を使用できます。1つの解決策は

charName :: Char -> String
charName = charName' . toLower
    where
        charName' 'a' = "Albert"
        charName' 'b' = "Broseph"
        charName' 'c' = "Cecil"
        charName' _   = "Not defined yet"

undefinedまた、最後のケースで、エラーを返したい場合は、 orを使用しないのはなぜerror error_msgですか?

于 2012-06-29T06:04:59.967 に答える
2
import Data.List (find)

charName :: Char -> String
charName c = maybe "Not defined yet" snd $ find (elem c . fst)
  [ ( "aA", "Arthur" )
  , ( "bB", "Broseph" )
  , ( "cC", "Cecil" )
  ]

使用されたものの説明:

  • fstand snd: タプルの最初または 2 番目の要素をそれぞれ抽出します
  • Data.List.find: 与えられた述語を満たすリストの要素を見つける
  • maybe: 値を処理しMaybeます。find結果が生成されるMaybeため、失敗の場合を処理する必要があります。この場合、(あなたがしたように)「まだ定義されていません」という文字列を選択しました
  • elem:特定のリストに何かが含まれているかどうかを判断します(Landeiの回答と同様の使用法)。Stringのリストとして表されることを思い出してくださいChar
  • 関数合成:.(elem c . fst)の は 2 つの関数を合成します。つまり、入力タプルを取得し、最初の要素 ( a String) にアクセスしてcから、 がその文字列内の文字の 1 つかどうかを判断します。関数構成は右から左に読みます。
  • $: ドル記号は関数適用です。主に括弧を避けるために使用されます。との使用を詳述するさまざまな StackOverflow の回答があり.ます$
于 2012-06-29T09:40:09.483 に答える