Почему эта лямбда-функция является ошибкой синтаксического анализа с сопоставлением с образцом и оператором cons? - PullRequest
3 голосов
/ 14 апреля 2019

Я пытаюсь проанализировать запись из списков списков (продолжение с этот вопрос ).

Вот моя запись

data Record = Record Text Text Text Text Text Text Text Text Text deriving (Show, Generic)

Этот синтаксис работает:

parseRecords :: [[Text]] -> [Record]
parseRecords = map (\[f1,f2,f3,f4,f5,f6,f7,f8,f9,_] -> Record f1 f2 f3 f4 f5 f6 f7 f8 f9)

Этот синтаксис проверяет, но у меня зафиксировано 10 параметров.Я предпочел бы иметь больше, чем это, и игнорировать те, которые больше, сопоставляя их с шаблоном в список [_], который я не буду передавать.Я попробовал следующее:

parseRecords = map (\f1:f2:f3:f4:f5:f6:f7:f8:f9:[_] -> Record f1 f2 f3 f4 f5 f6 f7 f8 f9)

Это, однако, не с:

Parse error (line 27, column 24): parse error on input ‘:’

Я мог бы поклясться, что видел подобный тип сопоставления с образцом, используемый в лямбдах раньше.Что мне не хватает, что мои операторы двоеточия являются ошибкой разбора?Трудно допросить, что происходит не так.

Спасибо!

1 Ответ

3 голосов
/ 14 апреля 2019

Так же, как вам нужны круглые скобки вокруг шаблонов в привязках функций,

f <b>(</b>x:xs<b>)</b> = ...

вам нужны скобки вокруг шаблонов в лямбдах:

parseRecords = map (\ <b>(</b>f1:f2:f3:f4:f5:f6:f7:f8:f9:_<b>)</b> -> Record f1 f2 f3 f4 f5 f6 f7 f8 f9)
                      -------pattern----------------
                   ------------------lambda function--------------------------------------

Иногда круглые скобки можно опустить, но не всегда. Список шаблонов:

<b>[]</b>           matches     []
<b>(</b>x:xs<b>)</b>       matches     [x, ...]      so that   (x:xs)   == [x]   ++ xs
<b>(</b>x:y:xs<b>)</b>     matches     [x, y, ...]   so that   (x:y:xs) == [x]   ++ (y:xs)
                                                          == [x,y] ++ xs
..... and so on ......

Это потому, что : ассоциируется справа, поэтому (x:y:xs) на самом деле (x:(y:xs)).

Наконец, _ - это шаблон. Это похоже на переменную модель, такую ​​как x или y или xs, но без имени. Каждый _ отличается от другого, как если бы он был назван с уникальным, но отсутствующим именем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...