我得到的类型"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"
注意函数定义如下:
take2 :: Signal -> Signal
take2 s = take 2 s
s
不是列表,它是Signal
,take 2 s
是列表,而不是Signal
。您需要的是从Signal
中获取列表,并从列表中构造Signal
为:
take2 (Signal s) = Signal $ take 2 s
由于不知道该使用哪些类比,我假设使用C/C++/#/etc背景-
data Signal = Signal [Double]
相当于
struct Signal { vector<double> contents; };
如果您希望直接表示[Double]
,而不是包含它,即类似的东西
typedef vector<double> Signal;
然后这在Haskell中被称为"类型同义词",并使用定义
type Signal = [Double]