繁体   English   中英

Haskell,数据类型函数以及如何提取信息?

[英]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 HillmaxSize ,并返回一个具有以下类型的最高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

这里发生的是maxSizeHill类型进行模式匹配,并提取名称和大小。 然后,它将具有大小的元组的值作为其第一个元素(这是有原因的,我将在稍后介绍)。

maxSize只是将maxSize'映射到MountainChain上(由于模式匹配),就像对待Hill 然后,我们将maximum应用于[(Float, String)]的返回列表。 幸运的是, maximum足够聪明,它将使用每个元组中的第一个元素对元组列表执行稳定的排序。 最后,我们提取返回的单个元组的第一个元素maximum使用fst

majorHill再次利用此机制,但提取了名称(使用snd )而不是高度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM