我知道F#中的变量默认是不可变的.但是,例如在F#interactive中:
> let x = 4;;
val x : int = 4
> let x = 5;;
val x : int = 5
> x;;
val it : int = 5
>
Run Code Online (Sandbox Code Playgroud)
所以,我将4分配给x,然后将5分配给x并且它正在改变.这是对的吗?它应该给出一些错误或警告吗?或者我只是不明白它是如何工作的?
一般来说,foldl避免赞成foldl'或foldr.引用真实世界Haskell:
由于foldl的thunking行为,在实际程序中避免这种功能是明智的:即使它没有完全失败,也会不必要地低效.相反,导入Data.List并使用foldl'.
然而,一些Prelude函数是根据它来定义的(例如(\\)和unionBy).为什么是这样?是不是对这些功能引入了太多的严格要求?
我一直在谷歌搜索多年,仍然找不到答案.根据我的理解,如果调用者在try/catch和/或try/finally块中包装了调用,那么在.NET 4.5上运行的F#3.0将不会对递归方法使用尾递归.如果有一个try/catch或者try/finally几个级别的堆栈会是什么情况?
在Don Syme,Adam Granicz和Antonio Cisternino的专家F#2.0中,pg.44
类型推断:使用|>运算符可以输入从输入对象到操作这些对象的函数的信息流.F#使用从类型推断收集的信息来解析某些语言结构,例如属性访问和方法重载.这依赖于通过程序文本从左到右传播的信息.特别是,在解决属性访问和过载时,不考虑位置右侧的类型信息.
所以显然使用|>可以帮助进行类型推断.
与往常一样,声明类型也很有帮助.
是否有其他手段/策略可用于帮助F#类型推断?
编辑
正如RamonSnir正确指出的那样,应该让类型推断做尽可能多的工作.因此,添加类型声明只是因为你可以不应该做什么.不要把这个问题或答案视为应该做的事情.我问这个问题是为了帮助更好地理解类型推断的细微差别,以及在类型推断需要帮助的情况下可能有什么帮助.因此,如果类型推断可以在没有帮助的情况下解析所有类型,那么不要给它任何,但是当它确实时,知道一些方法来帮助它会很好.
我正在尝试使用Windows服务调试生产问题,一旦多个并发连接处于活动状态,该服务就会迅速崩溃.通过核心转储和DebugDiag的神奇之处,我发现有一个挂起的GC操作,直到几个Preemptive GC禁用的线程完成了他们的工作才能启动.
以下是来自WinDbg的示例线程转储,显示了有问题的线程:
26 6e 1444 00..440 8009222 Disabled 00..200:00..f88 00..7a0 0 MTA (Threadpool Completion Port)
27 c1 1a0c 00..fe0 8009222 Disabled 00..e90:00..f88 00..7a0 0 MTA (Threadpool Completion Port)
28 b5 17bc 00..6f0 8009222 Disabled 00..268:00..f88 00..7a0 0 MTA (Threadpool Completion Port)
29 89 1f1c 00..ab0 8009222 Disabled 00..a30:00..f88 00..7a0 0 MTA (Threadpool Completion Port)
30 ac 2340 00..f70 8009220 Disabled 00..d00:00..d08 00..7a0 1 MTA (GC) (Threadpool Completion Port)
31 88 1b64 00..fd0 8009220 Enabled 00..b28:00..b48 00..7a0 0 MTA (Threadpool …Run Code Online (Sandbox Code Playgroud) 任何人都可以举例说明如何使用新数据和类似于此的不同类来微调预训练的imagenet网络:
关于这个话题已经有很多讨论,但我都是关于鞭打死马,特别是当我发现他们可能还在呼吸时.
我正在研究解析CSV的异常和异国情调的文件格式,为了好玩,我决定用我知道的2 .net语言C#和F#来表征性能.
结果......令人不安.F#大幅提升了2倍或更多(实际上我认为它更像是.5n,但是由于我正在测试硬件IO,因此获得真正的基准测试很难).
像读取CSV这样常见的性能特征让我感到惊讶(请注意,系数意味着C#在非常小的文件上获胜.我正在进行的测试越多,感觉C#的表现越差,这既令人惊讶又令人关注,因为它可能意味着我做错了).
一些笔记:Core 2 duo笔记本电脑,主轴磁盘80演出,3演出ddr 800内存,Windows 7 64位溢价,.Net 4,没有打开电源选项.
第一次运行后30,000行5宽1短语10个字符或更少给我3个支持尾调用递归(它似乎缓存文件)
对于尾部调用递归,300,000(重复相同的数据)是2的因子,F#的可变实现略微胜出,但性能签名表明我正在击中磁盘而不是ram-disking整个文件,这会导致半随机性能尖峰.
F#代码
//Module used to import data from an arbitrary CSV source
module CSVImport
open System.IO
//imports the data froma path into a list of strings and an associated value
let ImportData (path:string) : List<string []> =
//recursively rips through the file grabbing a line and adding it to the
let rec readline (reader:StreamReader) (lines:List<string []>) : List<string []> =
let line = reader.ReadLine()
match line with …Run Code Online (Sandbox Code Playgroud) 我有一个NUnit单元测试,它是用普通的F#库编写的,但它是针对可移植类库中的F#代码.
当我运行此测试(在Visual Studio 2013中)时,我得到以下异常:
Result Message: System.MissingMethodException : Method not found:
'Microsoft.FSharp.Control.FSharpAsync`1<System.IO.TextReader> FSharp.Data.Runtime.IO.asyncReadTextAtRuntime(System.Boolean, System.String, System.String, System.String, System.String)'.
Run Code Online (Sandbox Code Playgroud)
这就是我在Portable Class Library中的app.config中所拥有的:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-3.3.1.0" newVersion="3.3.1.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)
这就是我在普通F#库的app.config中所拥有的:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="FSharp.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.3.1.0" newVersion="4.3.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="nunit.framework" publicKeyToken="96d09a1eb7f44a77" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.6.3.13283" newVersion="2.6.3.13283" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud) 在研究与编程相关的主题时,我在lambdabot中遇到了Haskell的一个无点重构工具,并想知道F#是否可以重构为无点样式?
我不是主张使用无点样式,而是将其视为更好地理解函数的一种方法.
注意:pad回答了这个问题的早期版本,但我重写了这个问题,因为答案对于其他学习和使用F#的人来说是有价值的,我不希望因为一些接近的投票而删除它.
注意:仅仅因为我改变了问题,不要认为答案意味着无法使用F#编写一个自由点样式.它可以在很多情况下完成,但你必须遵守限制.
考虑这个界面:
type A<'a> =
abstract X : 'a
Run Code Online (Sandbox Code Playgroud)
让我们尝试用它int作为通用参数来实现它:
{ new A<int> with member this.X = 5 } // all is well
Run Code Online (Sandbox Code Playgroud)
现在,让我们尝试unit一个论点:
// Compiler error: The member 'get_X : unit -> unit' does not have the correct type to override the corresponding abstract method.
{ new A<unit> with member this.X = () }
Run Code Online (Sandbox Code Playgroud)
现在,如果我们定义一个非泛型接口,一切都运行良好:
type A_int =
abstract X : int
{ new A_int with member this.X = 5 } // works
type A_unit = …Run Code Online (Sandbox Code Playgroud) f# ×8
.net ×2
built-in ×1
c# ×1
clr ×1
f#-data ×1
haskell ×1
immutability ×1
performance ×1
pointfree ×1
shadowing ×1
tensorflow ×1
unit-type ×1