Types F夏普参数化类型-笛卡尔积

Types F夏普参数化类型-笛卡尔积,types,f#,Types,F#,Scott Wlaschin有一个关于这方面的很棒的教程 其中包括以下代码: type Result<'a> = | Success of 'a | Failure of string type Parser<'a> = Parser of (string -> Result<'a * string>) 类型结果) 我知道结果类型由'a参数化,并且用解析器构造的对象包含一个从字符串到结果而不是结果的函数,也许可以更好地解释这一点

Scott Wlaschin有一个关于这方面的很棒的教程

其中包括以下代码:

type Result<'a> =
    | Success of 'a
    | Failure of string

type Parser<'a>  = Parser of (string -> Result<'a * string>)
类型结果)
我知道结果类型由'a参数化,并且用
解析器
构造的对象包含一个从
字符串
结果
而不是
结果的函数,也许可以更好地解释这一点


如果我们用一个真实的例子来代替
'a
,可能会更清楚。假设你想解析一个
字符
,你就要创建一个
解析器
。该解析器将包含一个函数
string->Result
。在
结果的上下文中,这些都不是相同的
'a
。在
结果的定义中有一个
'a
,在
解析器的定义中有一个完全不同的、不相关的
'a

为了进一步解释,我将对其中一个进行重命名,否则它将只是口头上的意大利面:

type Result<'a> =
    | Success of 'a
    | Failure of string

type Parser<'b>  = Parser of (string -> Result<'b * string>)

这有助于我以一种清晰(er)的方式提出我的问题:当我看到
('b*string)
,我希望Result类型的每个对象都是笛卡尔积的一个元素,既有
b
又有
string
。但只有成功才是如此(正如你所说,
'a='b*string
)<代码>字符串的失败
中没有
'a
的实例-这与结果的参数化如何一致,因为
结果
'b*字符串
不同。它包含的值不同于
'b*string
OK的值-是的,我看到了。那么为什么参数写为
'b*string
。为什么有
string
呢?如果有第三个选项
|不确定int
,那么类型是否为
'b*string*int
?再次感谢您的耐心我对答案进行了编辑,试图澄清您的困惑。请检查它。是的-你已经正确地识别了我的混淆点-对称性b/n结果的结构和解析器的返回类型。我离启蒙只有一句话了!“由于与结果类型本身的结构完全无关的原因,解析器类型只需要将其设置为‘a*字符串’。”为什么解析器类型需要设置为‘b*字符串’
?-解析器的类型不是由结果的结构决定的吗?谢谢-我没有看博客。我觉得他的风格(书面和口头)非常清晰,引人入胜。
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>