Сопоставление с образцом на шаблоне - PullRequest
0 голосов
/ 15 октября 2018

Здравствуйте, я пытаюсь сопоставить шаблон для шаблона подстановочный знак , но мне нужно "захватить" wild card. Я пытаюсь проанализировать String до list из Maybe Int.

ВХОД
{123,aa,55,66}
ВЫХОД
[Just 123,Nothing,Just 55.4,Just 66.3]

Итак, я собрал следующий метод:

Метод

readDataRaw::String->[Maybe Int]
    readDataRaw (x:xs)=go [] [](x:xs) where
            go _ ls []         = ls
            go small big (x:xs)= case x of
                                  '}'    -> big
                                  ','    -> go [] ((readMaybe small::Maybe Int):big)  xs 
                                   c@(_) -> go [] c:small big xs

Ошибка

parse error on input `->'
   |
66 |                                    c@(_) -> go [] c:small big xs
   |                                          ^^

Как использовать подстановочный знак на правой сторонеиз -> в моем последнем случае?

1 Ответ

0 голосов
/ 15 октября 2018

Вы можете просто использовать идентификатор переменной , переменная не указывает какой-либо шаблон, поэтому вы можете написать его следующим образом:

readDataRaw::String -> [Maybe Int]
readDataRaw (x:xs) = go [] [](x:xs) where
    go _ ls [] = ls
    go small big (x:xs) = case x of
        '}' -> big
        ',' -> go [] ((readMaybe small::Maybe Int):big)  xs 
        <b>c</b> -> go [] c:small big xs

Выше, однако, есть некоторые ошибки, и неполныеузоры.Например, в readDataRaw вы указываете только шаблон (x:xs) в заголовке, тогда как, строго говоря, возможно, что вы вызываете функцию с пустым списком [].Он также «конфликтует» с (x:xs) в шаблоне go: это не проблема, поскольку Haskell принимает «ближайшую» переменную, поэтому определенную в предложении th3e go, но вносит некоторую путаницу.В последнем случае (с c вы также возвращаете go [] c : small big xs, что будет интерпретироваться как (go [] c) : small big xs, что не имеет особого смысла. Реорганизованная реализация может выглядеть следующим образом:

readDataRaw::String -> [Maybe Int]
readDataRaw = go [] [] where
    go _ ls [] = ls
    go small big (x:xs) = case x of
        '}' -> big
        ',' -> go [] ((readMaybe small::Maybe Int):big)  xs 
        <b>c</b> -> go (c:small) big xs

Но все же, это немного "некрасиво". Это отчасти потому, что неясно что вы хотите сделать.

...