假设我在haskell中将自己的数据类型设为:
data List a = ListNode a (List a) | ListEnd
我如何实现一个自定义的最大值函数,以查找列表的最大值,例如:
mymaximum (ListNode 10 ListEnd)
应返回10
mymaximum (ListNode 20 (ListNode 10 ListEnd))
将返回20
您可以定义一个递归函数:
myMaximum :: Ord a => List a -> a
myMaximum (ListNode a ListEnd) = a
myMaximum (ListNode a b ) = maximum [a, myMaximum b]
但是,更干净的解决方案将重用Haskell的现有maximum
function而不是定义您自己的:
maximum
为此,您需要为maximum :: forall a . (Foldable t, Ord a) => t a -> a
定义一个Foldable
实例,例如:
List
...完成后,将允许您在instance Foldable List where
foldMap f ListEnd = undefined
foldMap f (ListNode x ListEnd) = undefined
foldMap f (ListNode x r ) = undefined
s上调用maximum
:
List
为了进一步扩展贝雷亚尔的评论,请给予斯普拉奇的答复和左撇子的评论:
λ> maximum (ListNode 20 (ListNode 10 ListEnd))
20
然后类似地,
{-# LANGUAGE DeriveFoldable #-}
data List a = ListNode a (List a) | ListEnd
deriving Foldable