1

整数iをタプルのリストと再帰的に比較する Haskell 関数を作成しています。特に、整数をリスト内のそれぞれiと比較したい。次に、に対応するを印刷する場合a(a,b)i < aba

サンプル入出力

check 0.01 [(0.25, 'x'),(0.50,'y'),(0.75,'z')] = 'x'
check 0.4 [(0.25, 'x'),(0.50,'y'),(0.75,'z')] = 'y'
check 100 [(0.25, 'x'),(0.50,'y'),(0.75,'z')] = ' '

どのようにアプローチするかについて疑似コードを書きましたが、その疑似コードを実際のHaskell関数に変換するのに問題があります。これが私がこれまでに持っているものです:

check :: a -> [(a,b)] -> b
check i (a,b):xs = tuples d xs
    | if d <= a in (a,b) then = b //pseudocode
    | id d !<= a in (a,b) then recursively check the next tuple //pseudocode
    | otherwise ' ' // d is larger than all the a's of the tuple so return a space

私が考えている方法は正しいと思いますが、整数iをタプルのas と比較してタプルをトラバースする方法がわかりません。何か助けはありますか?

4

1 に答える 1

5

注意点:

  • 1同じ関数内で数値 likeと文字 like' 'を一緒に返すことはできません。型が異なるためです。すぐにできることは、帰りたい場所と帰りたい場所に戻るために使用することMaybe bです。Nothing' 'Just 11

  • 型の比較を行っているため、型クラスに属しているa必要があります。aOrd

したがって、変更されたプログラムは次のようになります

check :: (Ord a) => a -> [(a,b)] -> Maybe b
check d [] = Nothing
check d ((a,b):xs) | d <= a = Just b
                 | otherwise = check d xs

ghci で関数を試すと、

> check 0.01 [(0.25, 1),(0.50,2),(0.75,3)]
Just 1
> check 0.4 [(0.25, 1),(0.50,2),(0.75,3)]
Just 2
> check 100 [(0.25, 1),(0.50,2),(0.75,3)]
Nothing

findfromを使用しData.Listて、タイプを持つ関数を作成することもできます

find :: (a -> Bool) -> [a] -> Maybe a

したがって、機能チェックは次のようになります

check2 :: (Ord a) => a -> [(a,b)] -> Maybe b
check2 a = fmap snd . find ((> a) . fst)

(編集)編集された質問による変更

check :: (Ord a) => a -> [(a,Char)] -> Char
check d [] = ' '
check d ((a,b):xs) | d <= a = b
                   | otherwise = check d xs

fromMaybeからもご利用いただけるオリジナルチェック機能をご利用いただけるようにData.Maybe

newCheck ::  Ord a => a -> [(a, Char)] -> Char
newCheck d xs = fromMaybe ' ' $ check d xs
于 2012-10-01T13:56:36.550 に答える