0

cc次のように宣言された関数があります(1番目のパラメーターはa(list)で、2番目のパラメーターはb(listも)です。3番目のリストを返す必要があります。

cc :: [(String, String)] -> [(String, String)] -> [(String, String)]
cc a b = do

例:

a = [("aaa", "xxx"), ("bbb", "xxx")]
b = [("xxx", "ccc"), ("xxx", "ddd")]
c should be [("aaa", "ccc"), ("aaa", "ddd"), ("bbb", "ccc"), ("bbb", "ddd")]

cはの構成でaありb、各aペアの2番目の「インデックス」はbペアの最初の「インデックス」です。したがってa、( "aaa"、 "xxx")ペアの2番目の"index"は"xxx"であり、b( "xxx"、 "ccc")の最初の"index"として定義されます。これに関して、この新しいペア( "aaa"、 "ccc")をリターンリストに作成(追加)します。

問題は、Haskellでそれをどのように行うかです。:)

よろしくお願いします!

4

3 に答える 3

4

これを行う最も簡単な方法は、リスト内包表記です。

cc a b = [(u,x) | (u,v) <- a, (w,x) <- b, v == w]

aのすべての要素をのすべての要素とペアbにし、条件に応じてフィルタリングし、パーツからの結果を組み立てます。

于 2012-10-28T16:39:37.323 に答える
3

リスト内包表記を使用して、最初のペアの2番目の要素が2番目のペアの最初の要素と等しいという条件で、両方のリストからペアのすべての組み合わせを取得します。

[(x, z) | (x, y1) <- a, (y2, z) <- b, y1 == y2] 
于 2012-10-28T16:38:57.740 に答える
0
import Control.Applicative

c = (,) <$> (fst.unzip) a <*> (snd.unzip) b

-- or --

c = liftA2 (,) (fst $ unzip  a) (snd $ unzip b)
于 2012-10-30T11:01:30.087 に答える