由一个列表组成的对自己类型的列表操作



我得到的类型"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不是列表,它是Signaltake 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]

相关内容

最新更新