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

Ear*_*thy 0 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
Run Code Online (Sandbox Code Playgroud)

预期: 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"
Run Code Online (Sandbox Code Playgroud)

ass*_*.jc 6

注意函数定义如下:

take2 :: Signal -> Signal
take2 s = take 2 s
Run Code Online (Sandbox Code Playgroud)

s是不是一个清单,这是一个Signaltake 2 s是一个列表,而不是一个Signal,你需要的东西是从获取列表Signal,并构建一个Signal从列表如下:

take2 (Signal s) = Signal $ take 2 s
Run Code Online (Sandbox Code Playgroud)

  • 另外,考虑使用`newtype Signal = Signal [Double]`而不是`data ...`,以便编译器知道它可以在运行时表示中省去包装器. (4认同)