假设我在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) = max a (myMaximum b)
但是,更干净的解决方案将重用Haskell的现有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
......这,一旦完成,将允许您拨打maximum
的List
S:
λ> maximum (ListNode 20 (ListNode 10 ListEnd))
20
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句