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?谢谢!现在我不知道我怎么会错过这样一个基本的东西