您好,我正在尝试为通配符模式进行模式匹配,但是我需要“抢” 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
| ^^
右侧的通配符?
答案 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
但是仍然有点“丑陋”。部分原因是不清楚您要做什么。