3

私は標準的な方法が

(Eq z) => matchLists :: [x] -> [x] -> Bool
matchLists xs ys = xs == ys

しかし、外部から渡される要素の特別なマッチング関数があり、それを制御することはできません。

だから私が探しているのは

matchLists :: (x -> x -> Bool) -> [x] -> [x] -> Bool

(フーグルはノーと言います)

このようなシグネチャを持つカスタム関数を作成しますか?それとも代わりに何をしますか?

編集:

結果のリストは2つの入力リストのうち最小の長さであるため、zip関数は必要なことを行いません

編集:

これについてどう思いますか?

--matchListsWith :: (a -> a -> Bool) -> [a] -> [a] -> Bool
matchListsWith :: (a -> b -> Bool) -> [a] -> [b] -> Bool
matchListsWith _ [] [] = True
matchListsWith _ (_:_) [] = False
matchListsWith _ [] (_:_) = False
matchListsWith matcher (x:xs) (y:ys) = matcher x y && matchListsWith matcher xs ys
4

3 に答える 3

5

Data.Alignを使用すると、圧縮と長さの問題の両方を一度に処理できます

matchWith :: (a -> b -> Bool) -> [a] -> [b] -> Bool
matchWith f as bs = and $ alignWith combiner as bs where
  combiner = these (const False) (const False) f

これは、明示的な再帰関数と同じコードに展開されますが、タグを使用しData.Theseてさまざまなリストの配置をマークします。を一般化すると、ツリーやシーケンスなどの他の多くの構造にも一般化されますand

matchWith :: (Foldable f, Align f) => (a -> b -> Bool) -> f a -> f b -> Bool
matchWith f as bs = Foldable.and $ alignWith combiner as bs where
  combiner = these (const False) (const False) f

data Tree a = Tip | Branch a (Tree a) (Tree a) deriving ( Functor, Foldable )

instance Align Tree where
  nil = Tip
  align Tip Tip = Tip
  align (Branch a la ra) Tip = Branch (This a) (fmap This la) (fmap This ra)
  align Tip (Branch b lb rb) = Branch (That b) (fmap That lb) (fmap That rb)
  align (Branch a la ra) (Branch b lb rb) =
    Branch (These a b) (align la lb) (align ra rb)

私たちが持っているように

λ> matchWith (==) Tip Tip
True
λ> matchWith (==) (Branch 3 Tip Tip) (Branch 3 Tip Tip)
True
λ> matchWith (==) (Branch 3 Tip Tip) (Branch 3 Tip (Branch 3 Tip Tip))
False

(もしかしたら…)

instance Eq a => Eq (Tree a) where (==) = matchWith (==)
于 2013-11-05T19:02:06.463 に答える
4

ここでは、手書きのアプローチはまったく問題ないと思います。この問題に適した機能を持つライブラリをまだ使用していない場合は、コードを 3 行削減するためだけに別の依存関係を追加する価値はないと思います。

ただし、1 行を削ることはできます。

matchListWith :: (a -> b -> Bool) -> [a] -> [b] -> Bool
matchListWith f (x:xs) (y:ys) = f x y && matchListWith f xs ys
matchListWith _ []     []     = True
matchListWith _ _      _      = False
于 2013-11-05T19:51:03.697 に答える
1

1 つの可能性:

matchList f xs ys = and $ zipWith f xs ys
于 2013-11-05T17:03:11.690 に答える