gpt4 book ai didi

types - 在 F# 中柯里化(Currying) 'flexible types'

转载 作者:行者123 更新时间:2023-12-04 20:51:51 24 4
gpt4 key购买 nike

一小部分代码突出问题:

open System.IO

let do_smth i (stm : #System.IO.Stream) = // val do_smth : 'a -> #Stream -> unit
(*....*)
()

type SomeOps = SomeOps with
static member op (i : int) = do_smth i

let test_currying i = do_smth i // val test_currying : 'a -> (Stream -> unit)
// NB: Stream, not #Stream
let main() =
use stm = new System.IO.MemoryStream()
test_currying 42 stm // OK, upcasted to Stream somehow
SomeOps.op 42 stm // compiler error!

有人可以解释一下,为什么编译器在最后两行中的行为如此不同?以及为什么我们在 #Stream 中丢失了信息(关于灵活的 test_currying )功能?

最佳答案

这对我来说似乎是一个错误。编译器处理使用 let 构造的不同函数。和函数写为 static member .

特别是,我认为它不会为未在成员声明中显式声明的成员参数插入灵活类型(即,参数要么是部分函数应用的结果,要么是使用 fun 构造创建的)。

演示该行为的最简单示例不使用灵活类型,如下所示:

type A = 
static member op = fun (s:obj) -> ()
module B =
let op = fun (s:obj) -> ()

A.op "A" // Error
B.op "A" // Ok

根据规范(第 14.4.2 节,由 Brian 在已删除的 (?) 答案中发布),无论调用的函数是成员还是让绑定(bind)值,都应插入允许使用父类(super class)型的灵活类型。

关于types - 在 F# 中柯里化(Currying) 'flexible types',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9743756/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com