小编eir*_*rik的帖子

F#中的递归和不变性

请考虑以下简单示例:

type Parent = { Children : Child list }
and Child = { Value : int ; Parent : Parent }

let rec children = [ { Value = 0 ; Parent = parent } ]
and parent = { Children = children }
Run Code Online (Sandbox Code Playgroud)

F#编译器非常智能,可以正确初始化这些递归对象,可以通过运行验证

obj.ReferenceEquals(parent, parent.Children.Head.Parent)
Run Code Online (Sandbox Code Playgroud)

现在,考虑以下概括:

let length = 100 // assume arbitrary

let rec children = List.init length (fun i -> { Value = i ; Parent = parent })
and parent = { Children = …
Run Code Online (Sandbox Code Playgroud)

recursion f#

7
推荐指数
1
解决办法
309
查看次数

有人知道 QuotationEvaluator 这么慢的原因吗?

它在F#社区的PowerPack中的报价编制工厂的常识产生慢的代码,其实这么慢,它的性能比幼稚的解释更是雪上加霜。我一直在寻找造成这种情况的原因,但到目前为止我还没有找到令人信服的答案。有人声称,发生这种情况的原因要么是引用中模式匹配等内容的低效表示,要么是该库使用的表达式树固有的低效率。我想用一个简单的例子来说明为什么我认为这两者都不是真的:


#r "FSharp.Powerpack.Linq.dll"

open System
open System.Linq.Expressions

open Microsoft.FSharp.Quotations.Patterns

let powerpack = Microsoft.FSharp.Linq.QuotationEvaluator.Compile <@ 1 + 1 @>

// explicitly rewrite above quotation with expression trees
let expressionTree =
    let (Call(_,addM,_)) = <@ 1 + 1 @>
    let constExpr (x : 'T) = Expression.Constant(box x, typeof<'T>)
    let eval = Expression.Call(addM, constExpr 1, constExpr 1)
    let lambda = Expression.Lambda<Func<int>>(eval)
    lambda.Compile()

// reflection - based evaluation
let reflection =
    let (Call(_,addM,_)) = <@ 1 + 1 @>
    fun () -> …
Run Code Online (Sandbox Code Playgroud)

f# quotations

5
推荐指数
1
解决办法
225
查看次数

F#类型约束和反射

有没有办法通过反射确定给定的类型参数是否满足F#比较约束?

我怀疑不会,因为表达

typedefof<Set<_>>.MakeGenericType [| typeof<System.Type> |]
Run Code Online (Sandbox Code Playgroud)

似乎没有错误.不过,我想听听一些有关这方面的权威意见.

f#

3
推荐指数
1
解决办法
652
查看次数

1
推荐指数
1
解决办法
189
查看次数

标签 统计

f# ×4

.net ×1

.net-3.5 ×1

c# ×1

quotations ×1

recursion ×1