2017-10-01 8 views

答えて

2

、あなたが一緒に値を追加している、そしてNothing値(すなわち0として扱う)、あなたはまた、mapMaybeを使用して関数を書くことができ無視するのが自然だろうので、:

import Data.Maybe (mapMaybe) 

al :: [(Char, Int)] 
al = [('A', 1), ('B', 2), ('C', 3)] 

strToInt :: String -> Int 
strToInt = sum . mapMaybe (`lookup` al) 

をGHCi:

*Q46515794> strToInt "AB" 
3 
*Q46515794> strToInt "AC" 
4 
*Q46515794> strToInt "ABC" 
6 
1

ルックアップが常に成功するという前提条件がある場合は、fromJust (lookup c al)のように値を解析するのにfromJust :: Maybe a -> aを使用します。

それ以外の場合は、ルックアップに失敗した場合に返すために、「デフォルト」の値(例:0)が必要です。その後、fromMaybe :: a -> Maybe a -> aを使用して、デフォルト値を最初のパラメータとして使用し、値を解析します(たとえば、fromMaybe 0 (lookup c a1))。この場合

+3

これらは唯一の2つの可能性ではありません。 '(+)<$> lookup c a1 <*> strToInt cs'で' Nothing'を伝播させたいかもしれません。 –

1

あなたのロジックを制御する必要があると思います。提供するキャラクタがNothingを返すときに、あなたが望むものがわからない場合、この関数はMaybe型を返す方が良いでしょう。

Nothing0として扱いたい場合は、mapMaybeの方がいいです。それとも、その後、Maybeタイプの結果をしたい場合は...

al :: [(Char, Int)] 
al = [('A', 1), ('B', 2), ('C', 3), ('D', 4)] 

strToInt :: [(Char, Int)] -> String -> Maybe Int 
strToInt ts cs = foldr (\c m -> (+) <$> (lookup c ts) <*> m) (Just 0) cs 

*Main> strToInt al "AJN" 
Nothing 
*Main> strToInt al "ABCD" 
Just 10 
関連する問題