我看到我无法从F#编译器解释的行为(Visual F#3.1.1.0) - 表面上出现的只是命名本地和传递临时之间的区别实际上产生了行为差异.
我不了解F#行为,或者这是代码生成错误?(我知道,后者更有可能.)
Repro - 我发现很难在没有使用Reactive Extensions的情况下重新编译,所以这就像我得到它一样简单.请注意,try1和try2几乎是一样的.
open System
open System.Reactive.Linq
open System.Threading
let interval = TimeSpan.FromSeconds(0.5)
let testDuration = TimeSpan.FromSeconds(2.0)
let mkHandler () = // creates a function that closes over state
let count = ref 0
fun _ -> count := !count + 1
printfn "State is now %d" !count
let try1 () =
printfn "try1"
let handler = mkHandler ()
use subscription = Observable.Interval(interval).Subscribe(handler)
Thread.Sleep(testDuration)
let try2 () =
printfn …Run Code Online (Sandbox Code Playgroud) 在F#中,您可以使用成员函数定义记录,也可以创建类。
type Album = {
Id: int
Name: string
DateReleased: DateTime
Genre: Genre }
with
member this.PrintMessage() =
printf "Hello from %s\n" this.Name
Run Code Online (Sandbox Code Playgroud)
这么用
let first =
{ Id = 1;
Name = "Hello World!"
Genre = KPop;
DateReleased = DateTime(1991, 8, 12) }
first.PrintMessage()
Run Code Online (Sandbox Code Playgroud)
与类可能是这样的。
type Album(
Id: int,
Name: string,
DateReleased: DateTime,
Genre: Genre ) as me =
do
me.PrintMessage()
member this.PrintMessage() =
printf "Hello %s" Name
Run Code Online (Sandbox Code Playgroud)
什么时候方便使用另一个?只能对记录进行域建模吗?
是否可以通过某些隐藏的FSharp Casting将类转换为记录,反之亦然?
f# ×2