我得到的类型“ 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"
答案 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]