[英]Haskell, data type function and how to extract information?
我创建了两个数据类型,这些数据类型使我可以创建“山”和“山链”:
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
现在我的问题是如何编写一个函数,该函数将返回MountainChain
Hill
的maxSize
,并返回一个具有以下类型的最高Hill
(在MC内) name
的函数:
mSize :: MountainChain -> Size
majorHill :: MountainChain -> Name
您可以使用模式匹配和辅助函数轻松实现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
)而不是高度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.