Parsing F#解析器组合器

Parsing F#解析器组合器,parsing,haskell,f#,Parsing,Haskell,F#,我正在尝试将关于一元语法分析器()的示例翻译成F# 到目前为止,我已经: 类型解析器 匹配 | "" -> [] |空->[] |(s.Chars(0),s.Substring 1::[]) let sat(pred:(char->bool)):解析器= parserWf { 设!c=项 如果是pred c,则返回c } 让charc:解析器= sat(有趣的c'->c'.等于(c)) let rec string(str:string):解析器= parserWf { 如果(str.Lengt

我正在尝试将关于一元语法分析器()的示例翻译成F#

到目前为止,我已经:

类型解析器
匹配
| "" -> []
|空->[]
|(s.Chars(0),s.Substring 1::[])
let sat(pred:(char->bool)):解析器=
parserWf
{
设!c=项
如果是pred c,则返回c
}
让charc:解析器=
sat(有趣的c'->c'.等于(c))
let rec string(str:string):解析器=
parserWf
{
如果(str.Length>0)
然后
设!c=char(str.Chars 0)
设!cs=string(str.Substring 1)
printfn“字符串:%s”cs
返回c.ToString()+cs
其他的
返回“”
}
如果我从
string
方法中删除
else return”“
,则结果总是空列表。 在Haskell中,字符串函数声明为:

string :: String -> Parser String
string "" = return ""
string (c:cs) = do {char c; string cs; return (c:cs)}  
这个很好用。
为什么F#函数不能按预期工作?

我的Haskell有点生疏,但是你发布的代码片段不是等同于你的F#代码吗?也就是说,在Haskell中,你需要递归的基本情况(空字符串)


如果删除else部分,则对string的倒数第二次调用(即只剩下一个字符的调用)将不会从其递归调用(传递“”)中得到任何结果,因此它也不会返回任何有效结果。然后,这会“向上”传播,您将得到一个空列表。

您应该展开“不工作”。类型错误?运行时错误?错误的结果?“为什么F#函数不能按预期工作[当我删除
否则返回“
”?“那么。。。这在很大程度上取决于你的期望。也许你应该说这是什么。如果我删除字符串函数的最后两行(否则返回“”)。然后,如果我使用“runParser”(字符串“hello”)“hello!”,在F#中我得到了空列表,但在Haskell中我得到了[(“hello”,“!”)]。