我创建了两种数据类型,让我创建一个" Hill"和一个" MountainChain":
data Hill = Hill Name Size Isolation Prominence
deriving(Eq,Show)
type Name = String
type Size = Float
type Isolation = Float
type Prominence = Float
data MountainChain = MountainChain Name [Hill]
deriving(Eq,Show)
示例:
fstHill = Hill "fstHill" 45.0 18.0 4.0
scdHill = Hill "scdHill" 222.0 60.0 15.0
output:
*Main> fstHill
Hill "fstHill" 45.0 18.0 4.0
*Main> scdHill
Hill "scdHill" 222.0 60.0 15.0
我现在的问题是如何编写一个函数,该函数将返回maxSize
中Hill
的{{1}}以及返回最高MountainChain
的函数{ {1}}(在MC内)具有以下类型:
name
答案 0 :(得分:1)
您可以使用模式匹配和帮助函数轻松实现mSize
:
maxSize' :: Hill -> (Size, Name)
maxSize' (Hill n s _ _) = (s, n)
maxSize :: MountainChain -> Size
maxSize (MountainChain _ mc) = fst $ maximum $ maxSize' <$> mc
majorHill :: MountainChain -> Name
majorHill (MountainChain _ mc) = snd $ maximum $ maxSize' <$> mc
这里发生的是maxSize
模式匹配Hill
类型并提取名称和大小。然后它将一个元组的值作为其第一个元素的大小(有一个原因,我会稍微了解它)。
maxSize
只是将地图maxSize'
映射到MountainChain
,其中(感谢模式匹配)被视为Hill
列表。然后,我们将maximum
应用于返回的[(Float, String)]
列表。幸运的是,maximum
非常聪明,它使用每个元组中的第一个元素对元组列表执行稳定排序。最后,我们使用maximum
从fst
返回的单个元组中提取第一个元素。
majorHill
再次使用此机制,但提取名称(使用snd
)而不是高度。