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

时间:2016-05-10 15:34:51

标签: function haskell types typeclass

我创建了两种数据类型,让我创建一个" 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

我现在的问题是如何编写一个函数,该函数将返回maxSizeHill的{​​{1}}以及返回最高MountainChain的函数{ {1}}(在MC内)具有以下类型:

name

1 个答案:

答案 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非常聪明,它使用每个元组中的第一个元素对元组列表执行稳定排序。最后,我们使用maximumfst返回的单个元组中提取第一个元素。

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