Списочные операции над собственными типами, состоящими из одного списка - PullRequest
0 голосов
/ 07 января 2019

Я получил тип "Signal", который является только списком значений типа double, и я хочу использовать обычные операции над списками, как на нативном [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 голосов
/ 08 января 2019

Не зная, какие аналогии использовать, я предположу фон C / ++ / # / etc -

data Signal = Signal [Double]

эквивалентно

struct Signal { vector<double> contents; };

Если вы хотите на самом деле представлять [Double] напрямую, а не содержать его, то есть что-то похожее на

typedef vector<double> Signal;

Тогда это называется "синонимом типа" в Haskell и определяется с помощью:

type Signal = [Double]
0 голосов
/ 07 января 2019

Обратите внимание, что определение функции, как показано ниже:

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

s - это не список, это Signal, а take 2 s - это список, а не Signal. Вам нужно получить список из Signal и построить Signal из список как:

take2 (Signal s) = Signal $ take 2 s
...