通配符上的模式匹配

贝科维奇·阿德里安

你好,我想一个模式匹配外卡的模式,但我需要“抢” wild card。我正在尝试解析StringlistMaybe 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
   |                                          ^^

->在最后一种情况下,如何使用通配符右侧的通配符

威廉·范昂塞姆

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

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使用“最接近”变量,因此在th3ego子句中定义了该变量,但它带来了一些混乱。在最后一种情况下(使用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

但仍然有点“丑陋”。这部分是因为目前还不清楚什么你想做的事。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章