我一直在围绕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