你好,我想一个模式匹配外卡的模式,但我需要“抢” wild card
。我正在尝试解析String
到list
的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
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] 删除。
我来说两句