我正在调查aether library并注意到这一点
type Lens<'a,'b> =
('a -> 'b) * ('b -> 'a -> 'a)
static member (^=) (Set, (_, s): Lens<'a,'b>) =
fun (b: 'b) ->
s b : 'a -> 'a
在^ =函数中,b参数如果是lambda中的类型&#; b。但是,在lamda体中,为什么b类型现在是?
答案 0 :(得分:4)
然而,在lamda体中,为什么b型是'a now?
不是。
'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
所示。
我们可以在没有匹配的情况下重写该成员,并使用本地定义的函数,如下所示:
(Set, (_,s))
基本上,参数列表中的Lens<'a,'b>
将“s”绑定到('b -> 'a -> 'a)
的第二部分,或者键入 var stored = +localStorage.getItem('boxvalue');
的函数。在上面,我已经将其解释为更明确,并在自己的绑定中完成了这个提取。
然后该成员返回一个本地定义的函数(作为lambda)。上面,我重写了使用let绑定函数,因为它通常更清晰。
答案 1 :(得分:4)
我认为你只是误读了语法。代码s b : 'a -> 'a
并不意味着b
属于'a
类型。
阅读它的正确方法是将其分为两部分:冒号前的部分是表达式,冒号后面的部分是该表达式的类型。
因此,代码s b : 'a -> 'a
实际上意味着s b
属于'a -> 'a
类型。它没有单独说出s
或b
类型的任何内容。