【发布时间】:2021-01-15 11:29:03
【问题描述】:
我最近开始学习 Haskell,目前正在研究“用于解析的高阶函数”论文。你可以找到它Here.
论文定义了一个名为many的函数。
我正在尝试将其转换为 Haskell。
succeed v inp = [(v, inp)]
fail' inp = []
satisfy p [] = fail' []
satisfy p (x:xs)
| p x = succeed x xs
| otherwise = fail' xs
literal x = satisfy (==x)
alt' p1 p2 = \inp -> p1 inp ++ p2 inp
then' p1 p2 = \inp -> [((v1, v2), out2) | (v1, out1) <- p1 inp, (v2, out2) <- p2 out1]
using' p f = \inp -> [(f v, out) | (v, out) <- p inp]
many' p = ((p `then'` (many' p)) `using'` (:)) `alt'` (succeed [])
我已经单独测试了所有部件,它们工作正常。但是许多人的定义给了我错误。我似乎无法弄清楚是什么问题。我正在按照论文中提到的方式进行操作。
Main.hs:19:56: 错误: • 无法将类型“[a0]”与“[(a, b)] -> [(a, b)]' 匹配 预期类型:t -> [([(a, b)] -> [(a, b)], t)] 实际类型:t -> [([a0], t)] • 在‘alt’’的第二个参数中,即‘(succeed [])’ 在表达式中: ((p `then'` (many' p)) `using'` (:)) `alt'` (succeed []) 在“许多”的等式中: many' p = ((p `then'` (many' p)) `using'` (:)) `alt'` (succeed []) • 相关绑定包括 p :: t -> [(a, t)] (绑定在 Stum.hs:19:7) many' :: (t -> [(a, t)]) -> t -> [(b, t)] (绑定在 Stum.hs:19:1) | 19 | many' p = ((p `then'` (many' p)) `using'` (:)) `alt'` (succeed []) | 失败,未加载任何模块。 前奏>【问题讨论】:
-
今后,请不要包含文本图像(代码、错误消息等),除非问题特别涉及文本颜色、字体等。有视觉障碍的人无法访问文本图像人并阻碍搜索。
标签: haskell