给定数据结构规范,例如具有已知复杂性边界的纯函数映射,必须在若干实现之间进行选择.有一些关于如何选择正确的民间传说,例如红黑树被认为通常更快,但AVL树在工作负载上具有更好的性能和许多查找.
是否有关于这种知识的系统性介绍(发表的论文)(与集合/地图相关)?理想情况下,我希望看到对实际软件进行统计分析.例如,它可能得出结论,有N种典型的地图用法,并列出每种地图的输入概率分布.
是否有系统基准测试地图并设置不同输入分布的性能?
是否存在使用自适应算法根据实际使用情况更改表示的实现?
statistics functional-programming avl-tree red-black-tree data-structures
有没有人在部分信任场景中有F#代码的经验?如在,用[<AllowPartiallyTrustedCallers>]
?创建程序集?
我正在开发一些我们需要能够以部分信任方式运行的项目,我们一直在尝试使用2级安全规则(http://msdn.microsoft.com/en-us/library/dd233102. aspx).在实践中,我们的自包含组件很容易 - 只需放置一个属性; 但有时我们的程序集会引用未注释并假定为"SecurityCritical"的第三方DLL.这是它"有趣"的地方.
经过几天的努力,F#似乎存在严重问题..NET安全策略要求您注释类型/方法,[<SecuritySafeCritical>]
如果它们引用或调用"SecurityCritical"代码,这些代码恰好是NuGet上的大部分代码,因为这是它默认的代码.现在,在F#中,这可以正常工作,直到你开始使用闭包.你做不到:
namespace Foo
open System.Security
[<assembly: AllowPartiallyTrustedCallers>]
[<assembly: SecurityRules(SecurityRuleSet.Level2)>]
do()
[<SecurityCritical>]
module C =
let get () = [ 1 .. 10 ]
[<SecuritySafeCritical>]
module M =
let foo () =
seq {
for i in 1 .. 10 do
yield!
C.get ()
|> Seq.filter (fun x -> x % 2 = 0)
}
Run Code Online (Sandbox Code Playgroud)
这个程序集无法通过SecAnnotate.exe
检查,因为F#编译器将闭包提升到一个单独的类型,现在没有注释[<SecuritySafeCritical>]
,默认为Transparent,但引用了一些关键代码,这是一个错误.
这听起来像是一个小限制,但它花了我很多时间来改变代码以避免闭包并满足SecAnnotate约束.也许F#可以将安全属性传播给它创建的闭包类型?还有另一个简单的方法,我错过了吗?
我对基于异步的程序中的堆栈溢出感到惊讶.我怀疑主要问题是使用以下函数,它应该组成两个异步计算并行执行并等待两者完成:
let ( <|> ) (a: Async<unit>) (b: Async<unit>) =
async {
let! x = Async.StartChild a
let! y = Async.StartChild b
do! x
do! y
}
Run Code Online (Sandbox Code Playgroud)
有了这个定义,我有以下mapReduce
程序试图map
在reduce
部分和部分中利用并行性.非正式地,我们的想法是使用共享通道激发N
映射器和N-1
缩减器,等待它们完成,并从通道读取结果.我有自己的Channel
实现,这里替换ConcurrentBag
为更短的代码(问题影响两者):
let mapReduce (map : 'T1 -> Async<'T2>)
(reduce : 'T2 -> 'T2 -> Async<'T2>)
(input : seq<'T1>) : Async<'T2> =
let bag = System.Collections.Concurrent.ConcurrentBag()
let rec read () =
async {
match bag.TryTake() with
| true, value -> …
Run Code Online (Sandbox Code Playgroud) 这里的代码没有返回预期的内容:
jQuery('<div>Look here: [ jQuery0="null" ]</div>').html()
Run Code Online (Sandbox Code Playgroud)
相反,你得到:
Look here: [ ]
Run Code Online (Sandbox Code Playgroud)
有问题的jQuery源代码:
html: function( value ) {
return value === undefined ?
(this[0] ?
this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
null) :
this.empty().append( value );
},
Run Code Online (Sandbox Code Playgroud)
这背后的动机是.replace
什么?我没有时间来讨论jQuery的其余部分,但这样的代码让我想知道我是否应该在生产中使用jQuery.
您会对一般调试技术有何建议?我对原则和最佳实践比对特定平台解决方案更感兴趣.为了记录,我主要使用.NET(F#,C#),并涉及Haskell和Ocaml.
在这些星期五的晚上,我们谈到了与我的同事在步行回家的调试.我很惊讶地发现可以从VisualStudio调试器中查看和修改活动对象的状态.他还提到他认识的另一位开发人员,一位"Java大师",曾经向他展示了一些调试魔法,并给出了一篇关于调试的文章或小册子,这对我的同事最初的"没有任何东西"的态度提出了挑战.花了更多的时间比我希望找到虫子,我也准备好迎接挑战了.你会推荐哪些链接?
合法地重新分配F#3.0运行时(FSharp.Core.dll版本2.3.0.0,4.3.0.0),我在哪里可以找到证明?我准备了一个NuGet软件包,但是在发布软件包之前已经对许可进行了第二次考虑.微软发布了F#2.0运行时作为redist包 - 所以没有问题,但我的印象是获得F#3.0运行时的唯一方法是安装VS 2011或类似的; 我不确定在哪里检查重新分发F#运行时是否正常.
请注意,问题仅在于使用Microsoft密钥签名的二进制文件.代码的源代码在Apache许可下可用.
拥有带有DLL的NuGet包将使一些构建情况更容易.
开源F#存储库继续进行,并重新分发了Microsoft签名的FSharp.Core.dll(请参阅https://github.com/fsharp/fsharp),但我仍然希望确保允许这样做.
最近OCaml的3.12引入了一个特征的第一级封装模块:
一流的包模块.
- 用于打包模块的新类型表达式:
(module PT)
- 新类型的表达式,将模块打包为一等值:
(module MODEXPR : PT)
.- 新类型的模块表达式,将第一类值解压缩为模块:
(val EXPR : PT)
.- PT是表单的包类型
S
或S with type t1 = ... and ... and type tn = ...
(S
指模块类型).
我在哪里可以找到使用此功能的激励示例或论文?
哪些OCaml库提供了惰性列表处理?我正在寻找这些方面的东西:
type 'a lazy_list = (*'*)
| Nil
| Cons of 'a * 'a lazy_list lazy_t
let from f =
let rec gen n =
lazy
(
match f n with
| Some x ->
Cons (x, gen (n + 1))
| None ->
Nil
)
in
gen 0
Run Code Online (Sandbox Code Playgroud)
与回溯 Camlp4解析器的Stream
类型和语法糖的集成将是很好的.
f# ×4
ocaml ×3
.net ×2
asynchronous ×1
avl-tree ×1
backtracking ×1
debugging ×1
f#-3.0 ×1
functor ×1
haskell ×1
jquery ×1
lazylist ×1
mapreduce ×1
statistics ×1