HASKELL语言中我们自己的数据类型的最大值

问题描述 投票:0回答:2

假设我在haskell中将自己的数据类型设为:

data List a = ListNode a (List a) | ListEnd

我如何实现一个自定义的最大值函数,以查找列表的最大值,例如:

 mymaximum (ListNode 10 ListEnd)

应返回10

mymaximum (ListNode 20 (ListNode 10 ListEnd)) 

将返回20

haskell template-haskell haskell-platform
2个回答
5
投票

可以定义一个递归函数:

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

0
投票

为了进一步扩展贝雷亚尔的评论,请给予斯普拉奇的答复和左撇子的评论:

λ> maximum (ListNode 20 (ListNode 10 ListEnd))
20

然后类似地,

{-# LANGUAGE DeriveFoldable #-}

data List a = ListNode a (List a) | ListEnd
  deriving Foldable
© www.soinside.com 2019 - 2024. All rights reserved.