1

ハスケルについて質問です。データを含むリストとキー値を含むリストの 2 つのリストからデータのリストを作成する方法を知りたいです。例を挙げて説明します:

与えられた 2 つのリスト:[('a', "red"), ('b', "blue"), ('c', "green")][('a','b'), ('b', 'c'), ('c','a')]. ここで、最初のリストで指定された色で 2 番目のリストの値を変更したいと考えています。したがって、関数は を返す必要があり[("red","blue"), ("blue","green"), ("blue","red")]ます。

リスト内包表記について考えていましたが、Haskell は初めてで、どうすればよいかわかりません。または、これを行う簡単な方法はありますか?

これはおそらくばかげた質問ですが、誰かが例を挙げてくれれば、Haskell の思考プロセスにもう少し慣れるかもしれません。

4

3 に答える 3

4

別の方法は、使用することですMap

import Data.Maybe (mapMaybe)
import Data.Map (lookup
                ,fromList)
import Prelude hiding (lookup)

main :: IO ()
main = do
    let a = [('a', "red"), ('b', "blue"), ('c', "green")]
        b = [('a','b'), ('b', 'c'), ('c','a')]
        table = fromList a
    print $ mapMaybe (maybePair . (\(x,y) -> (x `lookup` table,
                                              y `lookup` table ))) b

maybePair :: (Maybe a, Maybe b) -> Maybe (a,b)
maybePair (Just x,Just y) = Just (x, y)
maybePair _ = Nothing

編集:

矢印の助けを借りて、最後の無名関数を凝縮することができます

import Control.Arrow ((***))
[…]
main :: IO ()
main = do
    let a = [('a', "red"), ('b', "blue"), ('c', "green")]
        b = [('a','b'), ('b', 'c'), ('c','a')]
        table = fromList a
        f x = x `lookup` table
    print $ mapMaybe (maybePair . (f *** f)) b
[…]
于 2012-11-23T12:15:30.883 に答える
2
-- second element from first (head) dropping tuples with bad key
color :: Eq a => a -> [(a, b)] -> b
color c = snd.head.dropWhile ((/=c).fst)

recolor a b = map (\(x, y) -> (color x a, color y a)) b

ランニング

Prelude> recolor [('a', "red"), ('b', "blue"), ('c', "green")] [('a','b'), ('b', 'c'), ('c','a')]
[("red","blue"),("blue","green"),("green","red")]

2 番目のリストの要素が最初のリストに見つからない場合。あなたは書ける

color :: Eq b => b -> [(b, a)] -> Maybe a
color c = fmap snd.listToMaybe.dropWhile ((/=c).fst)

それから

Prelude> recolor [('a',"red"),('b',"blue"),('c',"green")] [('a','h'),('u','c'),('c','a')]
[(Just "red",Nothing),(Nothing,Just "green"),(Just "green",Just "red")]

(あなたが必要import Data.Maybe (listToMaybe))

于 2012-11-23T11:42:13.717 に答える