通配符模式匹配
Pattern matching on wild card
您好,我正在尝试为 通配符 模式进行模式匹配,但我需要 "grab" wild card
。我正在尝试解析 String
到 Maybe Int
的 list
。
输入
{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
| ^^
在最后一个案例中,我如何使用 ->
右侧的通配符?
你可以只使用一个变量标识符,变量不指定任何模式,所以你可以这样写:
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)
模式,而严格来说,您可以使用空列表 []
调用该函数。它还 "clashes" 与 go
模式中的 (x:xs)
:这不是问题,因为 Haskell 采用 "closest" 变量,因此在 th3e go
子句,但它引入了一些混乱。在最后一种情况下(使用 c
,你会得到 return go [] c : small big xs
,这将被解释为 (go [] c) : small big xs
,这没有多大意义。"refactored" 实现可能看起来像:
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
但还是有点"ugly"。这部分是因为不清楚你想做什么。
您好,我正在尝试为 通配符 模式进行模式匹配,但我需要 "grab" wild card
。我正在尝试解析 String
到 Maybe Int
的 list
。
输入{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
| ^^
在最后一个案例中,我如何使用 ->
右侧的通配符?
你可以只使用一个变量标识符,变量不指定任何模式,所以你可以这样写:
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)
模式,而严格来说,您可以使用空列表 []
调用该函数。它还 "clashes" 与 go
模式中的 (x:xs)
:这不是问题,因为 Haskell 采用 "closest" 变量,因此在 th3e go
子句,但它引入了一些混乱。在最后一种情况下(使用 c
,你会得到 return go [] c : small big xs
,这将被解释为 (go [] c) : small big xs
,这没有多大意义。"refactored" 实现可能看起来像:
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
但还是有点"ugly"。这部分是因为不清楚你想做什么。