通配符上的模式匹配

时间:2018-10-15 13:16:26

标签: haskell pattern-matching wildcard

您好,我正在尝试为通配符模式进行模式匹配,但是我需要“抢” wild card。我正在尝试将String解析为{ list中的{1}}。

输入
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 :(得分: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

但是,上面有一些错误和不完整的模式。例如,在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

但是仍然有点“丑陋”。部分原因是不清楚您要做什么。