我一直在圍繞Haskell進行編碼,但無法掌握實現聯合函數的想法。 我也發現了一些嵌入Haskell平臺的函數定義。但問題是我需要一個簡潔易懂的方式才能使它工作。 任何人都可以幫助我嗎?Haskell中的聯合函數
回答
假設你正在談論union :: Eq a => [a] -> [a] -> [a]
這需要兩個輸入列表,並返回一個包含了所有每個參數列表元素的第三列表,那麼它在Data.List
這是在base
包中定義。
在它分成兩個函數的源,廣義功能unionBy
這需要平等且然後(類型等於(==) :: a -> a -> Bool
的函數)的一個自定義的定義定義了通過在(==)
傳遞作爲具體使用Eq
類型類的一個實行平等。
union :: (Eq a) => [a] -> [a] -> [a]
union = unionBy (==)
我們可以替代(==)
到unionBy
代碼,但是,作爲Haskell允許我們用等式推理。
union = unionBy (==)
-- so...
union :: Eq a => [a] -> [a] -> [a]
union xs ys = xs ++ foldl (flip (deleteBy (==))) (nubBy (==) ys) xs
此相同的圖案在deleteBy
和nubBy
,這兩者遵循相同的慣例,unionBy
定義發生兩次以上。 delete
從列表中移除一個元素,nub
返回一個唯一元素列表。我們將再次簡化定義以消除(==)
的所有痕跡,並簡單地假定元素a
已定義Eq
。
union xs ys = xs ++ foldl (flip delete) (nub ys) xs
現在定義可能更具可讀性。 xs
和ys
的union
是xs
附加到已由foldl (flip delete) _ xs
處理的ys
的唯一(「nub
牀」)值。 foldl
的最終結果就是一個一個嘗試到delete
的每個元素xs
從(nub ys)
。這意味着union xs ys
是xs
附加到ys
中的每個獨特元素少於xs
中的那些元素。
順便說一句,與此源在手,我們可以看到的union
一些古怪的行爲,例如如何在第一個參數從所述第二參數
union [1,1,2] [2] == [1,1,2]
union [2] [1,1,2] == [2,1]
這是有點對待重複不同的結果是使用[]
來表示Set
類似union
的概念。但是,如果我們使用Set.fromList
查看結果,那麼我們很好。
xs, ys :: Eq a => [a]
Set.fromList (xs `union` ys) == Set.fromList xs `Set.union` Set.fromList ys
這也給我們的union
union xs ys = Set.toList (Set.fromList xs `Set.union` Set.fromList ys)
那麼另一個定義請問是怎麼foldl
伎倆工作?讓我們解開foldl
的定義來查看,再次濫用等式推理。
union xs ys = xs ++ (case xs of
[] -> nub ys
(x:xs') -> foldl (flip delete) (delete x (nub ys)) xs'
)
這將使超過xs
元素特技更加明顯,它的循環,從(nub ys)
刪除它們一個接一個。
雖然希望這有助於使代碼union
更清晰一點,真正帶回家應該是均分的推理是解剖Haskell代碼的強大工具。不要害怕通過手動內嵌函數的定義來直接簡化代碼。
- 1. Haskell函數組合
- 2. Haskell複雜函數組合
- 3. Haskell函數組合方法
- 4. 在haskell中替換複合函數中的函數
- 5. Haskell中的參數函數
- 6. Haskell中的參數函數
- 7. 陣列聯合的聚合函數[HIVE]
- 8. Haskell中的多態函數
- 9. Haskell中的函數類型
- 10. Haskell函數中的括號
- 11. Haskell中的讀取函數
- 12. haskell中的高階函數
- 13. Haskell中的Luhn函數
- 14. Haskell中的空間函數
- 15. Haskell中的錯誤函數
- 16. haskell中的censorword函數
- 17. Haskell重寫規則和函數組合
- 18. 地圖。 foldr函數組合 - Haskell
- 19. 聯盟和聚合函數
- 20. primeTest函數Haskell
- 21. Haskell函數鏈
- 22. Haskell:'makeNtuple'函數?
- 23. Haskell函數
- 24. Haskell類型錯誤從函數應用到函數組合
- 25. 在Haskell中檢查函數
- 26. 在Haskell中導出函數
- 27. Haskell中的函數組合來計算功耗
- 28. 混淆了haskell中的複合函數與地圖
- 29. Haskell庫中的整數factiorization函數?
- 30. 泛化haskell函數
具體哪個聯合功能? – bheklilr
@bheklilr兩組整數之間的聯合。你能幫我嗎? –
你想要實際組合?你看過'Data.Set'嗎?在'Set's上有一個'union'函數。 – bheklilr