小编the*_*jaw的帖子

嵌套序列到分支/树数据结构

我不确定这是否是一个容易解决的问题,我只是遗漏了一些明显的东西,但是我一直在反对它.我试图用列表表达树分歧.这样我就可以使用简单的原语轻松地内联指定我的数据集,而不用担心顺序,并在以后从一组不同的列表中构建树.

所以我有一些像这样的列表:

 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)

是否有任何教科书示例或算法可以帮助我解决这个问题?看起来它可以优雅地解决,但我对它的所有刺痛看起来都非常可怕!

请随意发布任何功能语言的解决方案,我会酌情翻译.

谢谢!

f# ocaml haskell clojure

4
推荐指数
1
解决办法
438
查看次数

FParsec - 解析器序列

说我有一些文字:

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)

f# parsing fparsec

2
推荐指数
1
解决办法
157
查看次数

标签 统计

f# ×2

clojure ×1

fparsec ×1

haskell ×1

ocaml ×1

parsing ×1