haskell - 通配符上的模式匹配

标签 haskell pattern-matching wildcard

您好,我正在尝试对通配符模式进行模式匹配,但我需要“捕获”通配符。我正在尝试解析字符串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
   |                                          ^^

在最后一个案例中,如何使用 -> 右侧的通配符?

最佳答案

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

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) 模式,而严格来说,您可能会使用空列表来调用该函数[]。它还与 go 模式中的 (x:xs) 发生“冲突”:这不是问题,因为 Haskell 采用“最接近”的变量,因此定义在th3e go 子句,但它引入了一些困惑。在最后一种情况下(使用 c,您还返回 go [] c :small big xs,它将被解释为 (go [] c) :小大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

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

关于haskell - 通配符上的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52817665/

相关文章:

haskell - 这个用 do 表示法怎么写?

hashmap - 模式匹配选项时,引用类型不兼容的匹配臂引发错误

rust - Rust 模式匹配如何确定绑定(bind)变量是引用还是值?

java - 静态值中的泛型和通配符。它说这是同一个类,但不能编译

c - 通配符风格的 C 预处理器技巧

haskell - Haskell 中的 showS 技巧是什么?

haskell - 了解 Haskell 类型签名

haskell - Haskell 的 "do"关键字有什么作用?

python - 我的正则表达式模式在 Python 中查找重复循环有什么问题?

python - Python 中的通配符?