如果我有兩個列表,我想定義元素之間的位置相等(在特定意義上)。例如,如果:在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"])
]
像這樣的事情會在其他一些語言兩個迴路的事,但我花了一天時間嘗試寫在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"])]
這是隻有大約一半的權利;如果我堅持下去,我可能會做得對,但我只是想確保我不會重新發明輪子或什麼。
那麼...什麼是地道的Haskell方式來做到這一點?有一個嗎?我覺得我迫使Haskell成爲勢在必行,並且必須有一些更高階的函數或方法來完成這個任務。
的大問題是我不知道前手名單。它們可以是任意數據類型,不同長度和/或(嵌套)深度。
將它們從用戶輸入解析爲REPL並存儲在ADT中,該ADT最多可以爲Functor
,Monad
和Applicative
。列表理解需要Alternative
和MonadPlus
,但不能做那些,因爲然後分類理論會發瘋。
每個列表中的元素是否唯一唯一? – immibis
是的,我正在看的情況。 – ITA