Недопустимый список кортежей - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть это упражнение в Хаскеле, где у нас есть список кортежей, и нам нужно их разложить и поместить в разные списки.

Желаемый результат:

Main> unpair [(1,2),(3,4),(5,6)]
([1,3,5],[2,4,6])

Мой код,но я получаю некоторые ошибки:

unpair :: [(a,b)] -> ([a],[b])
unpair list = ([a|a<-list.fst], [b|b<-list.snd])

ошибки:

Template.hs:8:22:
Couldn't match expected type `b0 -> c0' with actual type `[(a, b)]'
Relevant bindings include
  list :: [(a, b)] (bound at Template.hs:8:8)
  unpair :: [(a, b)] -> ([a], [b]) (bound at Template.hs:8:1)
In the first argument of `(.)', namely `list'
In the expression: list . fst

Template.hs:8:22:
Couldn't match expected type `[a]'
            with actual type `(b0, b1) -> c0'
Relevant bindings include
  list :: [(a, b)] (bound at Template.hs:8:8)
  unpair :: [(a, b)] -> ([a], [b]) (bound at Template.hs:8:1)
In the expression: list . fst
In a stmt of a list comprehension: a <- list . fst
In the expression: [a | a <- list . fst]

Template.hs:8:39:
Couldn't match expected type `b2 -> c1' with actual type `[(a, b)]'
Relevant bindings include
  list :: [(a, b)] (bound at Template.hs:8:8)
  unpair :: [(a, b)] -> ([a], [b]) (bound at Template.hs:8:1)
In the first argument of `(.)', namely `list'
In the expression: list . snd

Template.hs:8:39:
Couldn't match expected type `[b]'
            with actual type `(a0, b2) -> c1'
Relevant bindings include
  list :: [(a, b)] (bound at Template.hs:8:8)
  unpair :: [(a, b)] -> ([a], [b]) (bound at Template.hs:8:1)
In the expression: list . snd
In a stmt of a list comprehension: b <- list . snd
In the expression: [b | b <- list . snd]

В вопросе также говорится, чтобы попытаться сделать это со списком пониманий.

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Это только немного намекает на ваше сообщение об ошибке.Проблема в том, что вы неправильно используете оператор ..Вы могли программировать на объектно-ориентированном языке раньше, когда list.fst вызывает функцию fst для объекта list.Это не тот случай в Haskell, где . - это инфиксная функция , используемая для создания двух функций.

Что вы действительно хотите сделать, так это выбрать изваш список, а затем применить fst / snd к этим кортежам по одному.Например:

[fst a | a <- list]

Вы также можете использовать сопоставление с образцом и пропустить альтогетер fst / snd, но не имеет значения, лучше это или хуже:

[a | (a, _) <- list]
0 голосов
/ 29 ноября 2018

Ты почти прав!Вы только что получили небольшие ошибки:

  • В Haskell вы не можете сделать list.fst - это синтаксически допустимо, но оператор . не делает то же самое в Haskellкак это происходит на других языках.fst является функцией и должна использоваться как таковая - попробуйте применить ее к значению, например fst list.
  • Что более важно, вы не можете применить fst или snd к списку типа list;поскольку Haskell является строго типизированным языком, эти функции должны применяться к одному значению, а не к списку.Попробуйте переместить эти функции влево от панели, например, чтобы получить все значения fst в списке, используйте [fst a | a <- list], что означает «для каждого значения a в list, примените fst к a».
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...