Когда вы пишете
triplize [x]
Вы говорите, что аргумент должен соответствовать шаблону [x]
. Этот шаблон представляет список с единственным значением, которое будет присвоено имени x
. Обратите внимание, что список не будет присвоен имени x
, только единственное значение в этом списке. Если вы попытались позвонить своей функции со списком []
или [1, 2]
, это приведет к ошибке, потому что вы не сказали своей функции, что делать с этими входами.
То, что вы, вероятно, хотите,
triplize x = concatMap (replicate 3) x
Здесь ваш шаблон просто x
, который соответствует любому списку, из пустого списка бесконечного списка. Обратите внимание, что шаблоны в определении вашей функции соответствуют тому, как вы сами делаете значения. В Haskell вы можете сопоставлять соответствие конструкторам, а списки могут быть построены с квадратными скобками и запятыми или они могут быть построены с использованием оператора :
, поэтому [1, 2, 3] == (1:2:3:[])
. Фактически, оператор :
- это то, как Haskell представляет списки внутри.
Пример, который использует больше соответствия шаблону:
sumSuccessive :: [Int] -> [Int]
sumSuccessive [] = [] -- Empty list
sumSuccessive [x] = [x] -- Singleton list (only one value)
sumSuccessive (x:y:rest) = x + y : sumSuccessive rest
-- Match a list with at least two elements `x` and `y`,
-- with the rest of the list assigned to the name `rest`
В этом примере функция будет взять список [1, 2, 3, 4]
и вернуть список [3, 7]
([1 + 2, 3 + 4]
).
А когда список пуст. Вы не поймаете этот случай? –
Не нужно учитывать это: – user32132321
@NeedHelp Да, вы это делаете. 'triplize [] = []', по вашему определению. Неполные функции считаются вредными. – AJFarmar