haskell - 通配符上的模式匹配
问题描述
您好,我正在尝试对通配符模式进行模式匹配,但我需要“抓取” wild card
。我正在尝试将 a 解析String
为 a list
of 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
| ^^
在我的最后一个案例中,我如何使用右侧的通配符->
?
解决方案
你可以只使用一个变量标识符,一个变量不指定任何模式,所以你可以这样写:
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
不过,还是有点“丑”。这部分是因为不清楚你想做什么。
推荐阅读
- php - 如何正确地从数组中获取信息以便可以插入数据库?
- flutter - 按下按钮时如何在 Flutter 上更改文本样式
- spring-batch - Spring Batch CompositeItemWriter 如何为委托编写者管理事务?
- apache-spark - Spark 抛出 FileNotFoundException 并说“刷新表表名”
- python-3.x - Pathos 排队任务然后得到结果
- javascript - 对数组的 mongoose.model 索引返回未定义
- javascript - 为什么需要 Angular Universal?
- html - 根据 lang 属性为所有元素设置 css 样式
- java - 尝试平均数字的程序。答案以 Integer 出现,而它应该是 Double
- python - cv2 findChessboardCorner 使用树莓派相机模块时精度低