2つのリストがある場合、要素間の位置の等価性(特定の意味で)を定義します。たとえば、もし:haskellリスト内の位置の等価性
k = [[3,1,2,4],[1,4,2,3],[1,3,4,2]]
s = [["a","b","c","d"],["d","a","c","b"],["c","b","a","d"],["d","b","c","a"]]
と私は関数に2 ∼ "c"
を言うと2
とc
は、リスト内の同じ位置を共有するすべてのタプルを返すことができるようにしたいです。
res= [([3,1,2,4],["a","b","c","d"])
,([3,1,2,4],["d","a","c","b"])
,([3,1,2,4],["d","b","c","a"])
,([1,4,2,3],["a","b","c","d"])
,([1,4,2,3],["d","a","c","b"])
,([1,4,2,3],["d","b","c","a"])
]
このような何かは他のいくつかの言語での2つのループの問題だろうが、私はHaskellでこの関数を記述しようとする日の大半を費やしてきました。私の現在の試み:
eqElem i1 (l1:ls1) i2 (l2:ls2) = helper1 i1 l1 i2 l2 0 where
helper1 i1 (p:ps) i2 l2 ctr1
| i1 == p = helper2 i2 l2 ctr1 0
| otherwise = helper1 i1 ps i2 l2 (ctr1+1)
helper2 i2 (p:ps) ctr1 ctr2
| i2==p && ctr1==ctr2 = (l1,l2):(eqElem i1 (l1:ls1) i2 ls2)
| otherwise = helper2 i2 ps ctr1 (ctr2+1)
helper2 i2 [] ctr1 ctr2 = eqElem i1 ls1 i2 (l2:ls2)
eqElem i1 [] i2 _ = []
右は今、これは与える:約半分の権利である
*Main Lib> eqElem 2 k "c" s
[([3,1,2,4],["a","b","c","d"]),([3,1,2,4],["d","a","c","b"])]
。私はそれを維持するならば、私はおそらくそれを正しく得ることができますが、私はホイールや何かを再発明していないことを確認したいだけです。
だから、これを行う慣用的なハスケルの方法は何ですか? 1つはありますか?私はハスケルを強制的に強制するように感じており、これを実現するために使用できるいくつかの高次関数や方法が必要であると感じています。
大きな問題は、私はが手の前にリストを知らないということです。それらは、任意のデータ型、異なる長さ、および/または(ネストされた)深度のものであり得る。
これらはユーザー入力からREPLに解析され、最大でFunctor
,Monad
、Applicative
とすることができるADTに格納されます。リストの理解にはAlternative
とMonadPlus
が必要ですが、カテゴリ理論が狂ってしまうため、リストの理解にはAlternative
とMonadPlus
が必要です。
要素はそれぞれのリストで必ずしも一意ではありませんか? – immibis
はい、私が見ていたケースです。 – ITA