在外卡上的模式匹配

Ber*_*ian 2 haskell wildcard pattern-matching

你好我试图模式匹配的外卡模式,但我需要"抢"了wild card.我正在尝试解析StringlistMaybe Int.

INPUT
{123,aa,55,66}
OUTPUT
[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
Run Code Online (Sandbox Code Playgroud)

错误

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

如何->在我最后一个案例的右侧使用外卡?

Wil*_*sem 5

您可以只使用变量标识符,变量不指定任何模式,因此您可以像下面这样编写它:

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
Run Code Online (Sandbox Code Playgroud)

但是上面有一些错误和不完整的模式.例如,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 
        c -> go (c:small) big xs
Run Code Online (Sandbox Code Playgroud)

但是,它仍然有点"难看".这部分是因为目前还不清楚什么你想做的事.