F# 在本例中,为什么参数b的类型为a?

F# 在本例中,为什么参数b的类型为a?,f#,F#,我正在调查并注意到了这一点 type Lens<'a,'b> = ('a -> 'b) * ('b -> 'a -> 'a) static member (^=) (Set, (_, s): Lens<'a,'b>) = fun (b: 'b) -> s b : 'a -> 'a 型透镜= ('a->'b)*('b->'a->'a) 静态成员(^=)(集合,(uz,s):

我正在调查并注意到了这一点

 type Lens<'a,'b> =
    ('a -> 'b) * ('b -> 'a -> 'a)

 static member (^=) (Set, (_, s): Lens<'a,'b>) =
            fun (b: 'b) ->
                s b : 'a -> 'a
型透镜=
('a->'b)*('b->'a->'a)
静态成员(^=)(集合,(uz,s):镜头)=
乐趣(b:'b)->
s b:“a->”a
在^=函数中,b参数if在lambda中的类型为“b”。然而,在拉姆达体内,为什么b型现在是“a”型

然而,在拉姆达体内,为什么b型现在是“a”型

事实并非如此

b
是一个输入,输入的是
'b
,如
fun(b:'b)->
所示

我们可以在不使用匹配项的情况下,使用本地定义的函数重写该成员,如下所示:

static member (^=) (Set, lens: Lens<'a,'b>) =
    // Pattern match to extract out the 2nd portion of the lens, which is a function: 'b -> 'a -> 'a
    let (_,s) = lens

    // Define a function that takes a 'b and returns a new function of type: 'a -> 'a
    let fn (b: 'b) : 'a -> 'a =
        s b // this just partially applies s with the input "b"
    fn // Return the function
静态成员(^=)(集合,镜头:镜头)=
//模式匹配以提取镜头的第二部分,这是一个函数:“b->”a->”a
let(u,s)=透镜
//定义一个接受“b”并返回类型为“a->”a的新函数的函数
让fn(b:'b):'a->'a=
sb//这只是部分地将s应用于输入“b”
fn//返回函数
基本上,参数列表中的
(Set,(,s))
将“s”绑定到
镜头的第二部分,或者绑定到键入的
('b->'a->'a)
。在上面,我将其分解为更明确的内容,并在其自身的绑定中完成了此提取


然后,该成员返回一个本地定义的函数(作为lambda)。上面,我用一个let-bound函数重写了它,因为它通常更清晰。

我认为你只是误读了语法。代码
sb:'a->'a
并不意味着
b
属于
'a
类型

正确的阅读方法是将其分为两部分:冒号之前的部分是表达式,冒号之后的部分是该表达式的类型


因此代码
sb:'a->'a
实际上意味着
sb
属于
'a->'a
类型。它没有单独说明
s
b
的类型。

你为什么这么认为?@foggyinder我不确定。这就是我问的原因。我是说为什么你认为
b
有“a”型?顺便说一句,我们可以继续吗?现在说得通了。忘记了咖喱/部分应用。你知道为什么他们会在这种情况下使用部分应用程序吗?还需要设置参数吗?谢谢你的回答。那么sb返回的是一个lamda,它返回的是类型a?谢谢!现在我不知道我怎么会错过这样一个基本的东西