列出由一个列表组成的自身类型的操作

时间:2019-01-07 16:59:39

标签: haskell ghci

我得到的类型“ Signal”仅是双打列表,并且我想像在本地[Double]上那样使用普通的列表操作。这应该是可能的,但不会编译。您如何在语法上正确地向编译器描述这一点。

这是测试代码:

data Signal = Signal [Double] deriving(Show, Eq)

test :: Signal
test = Signal [1.0,2.0,3.0]

take2 :: Signal -> Signal
take2 s = take 2 s

预期:take2 test = [1.0,2.0]

实际:

"Couldn't match expected type ‘Signal’ with actual type ‘[a0]’
In the expression: take 2 s
In an equation for ‘take2’: take2 s = take 2 s"

2 个答案:

答案 0 :(得分:6)

请注意,函数定义如下:

take2 :: Signal -> Signal
take2 s = take 2 s

s不是列表,它是Signal,而take 2 s是列表,不是Signal,您需要的是从{{ 1}},然后从列表中构造一个Signal

Signal

答案 1 :(得分:0)

不知道使用哪种类比,我假设使用C / ++ /#/ etc背景-

data Signal = Signal [Double]

等同于

struct Signal { vector<double> contents; };

如果您希望直接代表[Double]而不是直接包含它,即类似于

typedef vector<double> Signal;

然后在Haskell中称为“类型同义词”,并使用以下方法进行定义:

type Signal = [Double]