首页 > 解决方案 > 通配符上的模式匹配

问题描述

您好,我正在尝试对通配符模式进行模式匹配,但我需要“抓取” wild card。我正在尝试将 a 解析String为 a listof Maybe 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

错误

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

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

标签: haskellpattern-matchingwildcard

解决方案


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

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)在 head 中指定模式,而严格来说,您可以使用空列表调用函数[]。它还与模式(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

不过,还是有点“丑”。这部分是因为不清楚想做什么。


推荐阅读