0

私の関数は、Maybe Int のリストを引数として取ります。element = Nothing の場合、 . 要素が Just Int の場合、数値が出力されます。ベースケースをキャプチャしたと思っていましたが、正しいものを完全に取得できたとは思いません。網羅的でないパターン エラーが発生します。

replaceValue :: [Maybe Int] -> String
replaceValue (x:xs) 
    | (x:xs) == []        = []
    | isNothing x == True = '.':replaceValue xs
    | isJust x == True    = intToDigit(fromJust x):(replaceValue xs)

正しい方向へのうなずきは大歓迎です!:-)

4

2 に答える 2

6

@MathematicalOrchid はすでに回答しています。

isNothing/isJust/fromJustusing を使用すると、コードが必要以上に複雑になることを付け加えておきます。さらに、fromJust渡すとクラッシュするため、一般的に危険です。Nothingここでは、ガードを使用してこれを正しく防止しますisJustが、大規模なプログラムではそれを忘れがちです。

幸いなことに、パターン マッチングを使用して、これらすべての補助関数を回避できます。

replaceValue :: [Maybe Int] -> String
replaceValue []             = []
replaceValue (Nothing : xs) = '.' : replaceValue xs
replaceValue (Just a : xs)  = intToDigit a : replaceValue xs

Haskell に慣れると、上記のような標準的な再帰スキームをよりコンパクトな形式で書き直し、いくつかの高次ライブラリ関数を利用できるようになります。

replaceValue :: [Maybe Int] -> String
replaceValue = map (maybe '.' intToDigit)
于 2014-10-01T17:01:54.203 に答える