如何解决F尖锐的参数化类型-笛卡尔积
Scott Wlaschin的parser combinators教程很棒。
其中是这段代码:
type Result<'a> =
| Success of 'a
| Failure of string
type Parser<'a> = Parser of (string -> Result<'a * string>)
我知道Result类型由'a进行了参数化,并且用Parser
构造的对象包含从string
到Result<'a * string>
的函数。
我不了解<'a * string>
。我知道这是笛卡尔积,Result
可以是Success of 'a
或Failure of string
,但是Result
的类型是Result<'a>
而不是{{1 }}。
很明显,我缺少一些东西,感谢您的帮助!
预先感谢
解决方法
不相同的'a
。 'a
的定义中有一个Result
,而'a
的定义中有一个完全不相关的Parser
。
出于进一步说明的目的,我将重命名其中之一,否则将只是口头意大利面:
type Result<'a> =
| Success of 'a
| Failure of string
type Parser<'b> = Parser of (string -> Result<'b * string>)
因此,在这里,在Parser
的定义内,我们使用Result
,并将其'b * string
用作参数。因此,在Result
,'a = 'b * string
的定义内。
这又意味着有两个可能的值:
-
Success of ('b * string)
-
Failure of string
含义是解析器可能失败(将错误返回为string
)或成功,在这种情况下,解析器将返回结果解析后的值'b
加上“ remainder”(又名输入文本的“未消费部分”。
从您的评论看来,您可能会因为'a * string
似乎反映了Result
情况Success of 'a
和Failure of string
的事实而感到困惑。
这种看似对称的现象纯属巧合。出于与Parser
类型本身的结构完全无关的原因,'a * string
类型只需要将其设为Result
。
为进一步说明,这是其他一些同样有效的类型:
type T = Result<int>
type U = Result<bool list>
type V<'a> = Result<int * 'a * string>
type W = Result<Result<float>>
type F<'q> = 'q -> Result<obj>
type G = Result<string> -> int
type H<'a,'b,'c> = Result<'a> -> Result<'b> -> Result<'c>
,
也许the blog post可能会解释得更好。
如果我们用一个真实的例子代替'a
,可能会更清楚。假设您想解析char
,则将创建一个Parser<char>
。该解析器将包含一个函数string -> Result<char * string>
。在Result<'a>
的上下文中,'a
是char * string
-它与'a
的{{1}}并不相同。
该函数的结果为Parser<'a>
或Success of (char * string)
。
在Failure of string
情况下,Success
是一个元组-第一项是解析的char * string
,第二项是剩余的char
。这样的想法是,如果解析string
,则结果可能是"ABC"
。
在Success ('A',"BC")
情况下,Failure
是一些错误消息-例如string
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。