如果未命名类的成员,我该如何访问它们?

时间:2019-01-15 13:56:42

标签: haskell

我有一个预定义的类:

  data Wave = Wave [Double]推导(显示,等式)
 

我想在类中使用函数'map',因此我必须访问[Double]值。但是我不知道如何。

我在这里查看:访问自定义数据类型的成员在Haskell中,但这没有回答我的问题,因为我无法更改该类(或该类的名称参数)。

我试图写:

  waveToDoubleList :: Wave-> [Double]
    (波)=波
 

2 个答案:

答案 0 :(得分:12)

您忘记包含功能名称

waveToDoubleList :: Wave -> [Double]
waveToDoubleList (Wave wave) = wave
----------------

现在它应该可以工作了。

(Wave wave)被称为模式。此功能通过模式匹配起作用。

Wave有两个作用:作为数据构造函数或模式名称;并作为类型的名称。

开始学习Haskell时,您可能需要为这些角色使用单独的名称:

data Wave = MkWave [Double] deriving (Show, Eq)

waveToDoubleList :: Wave -> [Double]
waveToDoubleList (MkWave wave) = wave

Wave是一种类型;我们使用MkWave数据构造函数创建此类型的值。

答案 1 :(得分:6)

您可以非常轻松地命名数据类型的参数。例如

data Wave = Wave { waveContents :: [Double] } deriving (Show, Eq)

这将产生一个函数waveContents :: Wave -> [Double]。您也可以用以下相同的方式构造数据:Wave [1.2, 2.3] :: Wave

以下是如何使用此示例:

λ myWave = Wave [1.2, 2.3, 3.4]
λ waveContents myWave
[1.2, 2.3, 3.4]
λ Wave $ map (+1) $ waveContents myWave
Wave [2.2, 3.3, 4.4]