我不确定这是否是一个容易解决的问题,我只是遗漏了一些明显的东西,但是我一直在反对它.我试图用列表表达树分歧.这样我就可以使用简单的原语轻松地内联指定我的数据集,而不用担心顺序,并在以后从一组不同的列表中构建树.
所以我有一些像这样的列表:
a = ["foo", "bar", "qux"]
b = ["foo", "bar", "baz"]
c = ["qux", "bar", "qux"]
Run Code Online (Sandbox Code Playgroud)
我想有一个函数,它将采用这些列表的序列并表达如下所示的树:
myfunc :: [[a]] -> MyTree a
(root) -> foo -> bar -> [baz, qux]
-> qux -> bar -> qux
Run Code Online (Sandbox Code Playgroud)
理想的解决方案是能够采用不同长度的序列,即:
a = ["foo"; "bar"; "qux"]
b = ["foo"; "bar"; "baz"; "quux"]
==
(root) -> foo -> bar -> [qux, baz -> quux]
Run Code Online (Sandbox Code Playgroud)
是否有任何教科书示例或算法可以帮助我解决这个问题?看起来它可以优雅地解决,但我对它的所有刺痛看起来都非常可怕!
请随意发布任何功能语言的解决方案,我会酌情翻译.
谢谢!
说我有一些文字:
a = "foobarbaz"
b = "foobar"
c = "foo"
d = "rubbish"
e = "foobazbar"
Run Code Online (Sandbox Code Playgroud)
和三个解析器foo,bar和baz分别用于字符串'foo','bar'和'baz'.
我如何创建一个可以给我结果的解析器:
a = ["foo", "bar", "baz"]
b = ["foo", "bar"]
c = ["foo"]
d = []
e = ["foo"]
Run Code Online (Sandbox Code Playgroud)
什么时候对上面的输入运行?在构建列表时,基本上尝试每种可能性直到失败.我可以使用用户状态,但我想尽可能避免.(我想让各个解析器自己对用户状态一无所知)
我得到的最接近的是下面的fooseq:
let foo = pstring "foo"
let bar = pstring "bar"
let baz = pstring "baz"
let foobar = pipe2 foo bar Seq.of2
let foobarbaz = pipe3 foo bar baz Seq.of3
let fooseq = choice (Seq.map attempt [foobarbaz; foobar; foo |>> Seq.of1 ;]) …Run Code Online (Sandbox Code Playgroud)