And*_*ebb 3 f# partial-application pointfree tacit-programming
这里与我的问题密切相关,但实际上是一个不同的问题......
考虑以下F#: -
type TestClass() =
let getValFromMap m k = Map.find k m
let mutable someMap : Map<string,int> = Map.empty
let getValFromMapPartial key = getValFromMap someMap key
let getValFromMapPartialAndTacit = getValFromMap someMap
module TestModule =
let getValFromMap m k = Map.find k m
let mutable someMap : Map<string,int> = Map.empty
let getValFromMapPartial key = getValFromMap someMap key
let getValFromMapPartialAndTacit = getValFromMap someMap
Run Code Online (Sandbox Code Playgroud)
在类案例和模块案例中,getValFromMapPartial并getValFromMapPartialAndTacit以非常不同的方式运行,并以不同方式编译为IL.在类和模块的情况下,前者的行为类似于真正的语法函数,后者的行为类似于lambda计算函数(我知道这要归功于用户Marc Sigrist).
在模块的情况下,类型签名似乎是正确的: -
getValFromMapPartial : key:string -> int
getValFromMapPartialAndTacit : (string -> int)
Run Code Online (Sandbox Code Playgroud)
但在类案例中,类型签名是相同的: -
getValFromMapPartial : (string -> int)
getValFromMapPartialAndTacit : (string -> int)
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
既然getValFromMapPartial在这两种情况下都充当了真正的语法函数,为什么它会在类的情况下被输入为lambda计算函数?
我只能想到几次,你会永远不必担心之间的区别A -> B和(A -> B)(见F#规范对签名符合相关评论部分):
A -> B,而语法函数或任何其他函数值都可以实现签名(A -> B).也就是说,后者的签名是前者的超集.A -> B实现为方法,而带签名的函数(A -> B)则实现为类型的值Microsoft.FSharp.Core.FSharpFunc<A,B>.否则,差异无关紧要.在这种情况下,正如@ildjarn所说,类型定义中的let-bound值是私有的,因此上述两个注意事项并没有发挥作用TestClass,它只是一个没有后果的实现细节.
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |