F# 灵活-这是一个非常重要的功能,其成本只是|>的罕见使用,很少使用类型约束。在你最后一点上,我可能有点奇怪,我倾向于以相反的方式对相关函数进行分组(使用允许我使用的语言)。例如,假设我有一个复杂的函数C,函数a和函数B都使用函数C,然后我将函数从上到下排列a

F# 灵活-这是一个非常重要的功能,其成本只是|>的罕见使用,很少使用类型约束。在你最后一点上,我可能有点奇怪,我倾向于以相反的方式对相关函数进行分组(使用允许我使用的语言)。例如,假设我有一个复杂的函数C,函数a和函数B都使用函数C,然后我将函数从上到下排列a,f#,language-design,type-inference,F#,Language Design,Type Inference,灵活-这是一个非常重要的功能,其成本只是|>的罕见使用,很少使用类型约束。在你最后一点上,我可能有点奇怪,我倾向于以相反的方式对相关函数进行分组(使用允许我使用的语言)。例如,假设我有一个复杂的函数C,函数a和函数B都使用函数C,然后我将函数从上到下排列a、B、C。我想我喜欢这样读,因为实现是这样展开的(向我展示大图,然后是细节)。话虽如此,我并不太在意F#forces的排序,尽管我没有参与过大型项目。你喜欢的排序是最自然的,因为它反映了评估的顺序。有了按值调用,F#方式更自然——特别是因为定义


灵活-这是一个非常重要的功能,其成本只是|>的罕见使用,很少使用类型约束。在你最后一点上,我可能有点奇怪,我倾向于以相反的方式对相关函数进行分组(使用允许我使用的语言)。例如,假设我有一个复杂的函数C,函数a和函数B都使用函数C,然后我将函数从上到下排列a、B、C。我想我喜欢这样读,因为实现是这样展开的(向我展示大图,然后是细节)。话虽如此,我并不太在意F#forces的排序,尽管我没有参与过大型项目。你喜欢的排序是最自然的,因为它反映了评估的顺序。有了按值调用,F#方式更自然——特别是因为定义可能会立即产生影响。有趣。综上所述,你更喜欢F#的名义类型还是OCaml的结构类型?我的学者更喜欢OCaml方式,因为它更简洁(例如,
System.Windows.Controls.ScrollBarVisibility.Visible
on.NET在OCaml中就是
Visible
)。我的企业家更喜欢F#方式,因为我的客户的易用性对于商业可行性至关重要。也许有更好的折衷办法。我实际上不喜欢这个问题,但它已经得到了一些奇妙的、启发性的回答,因此我也不情愿地投了赞成票:)@J Cooper:“哈斯克尔(例如)没有这样的限制,推理也同样有力。”。当你考虑杂质或性能时,Haskell不可能有同样强大的类型推断。例如,Haskell的
floor
函数通常比任何其他编译语言运行速度慢几个数量级,因为它无法推断正确的静态类型,因此只能求助于运行时分派。此外,如果我停止从
randIntList
函数中删除顶级类型注释,那么它将停止使用臭名昭著的
模糊类型变量编译“WTF,为什么F#不能做这个愚蠢的推断?!:)我对F#不熟悉。现在,我正试图找出在使用泛型函数时偶尔会遇到的FS0030:值限制错误。另请参阅“无方法重载”对Haskell来说更容易一些。函数定义(参数和返回类型)可以明确地解译。@ng:…有很多人认为最好将这些事情明确化。”很多人宁愿明确地注释懒惰,而不是严格和杂质,因为懒惰很少有用,而严格和杂质无处不在(即使在真实的Haskell代码中)@JonHarrop这是真的。但它改变了代码的语义。很多人会和你争论说,懒惰通常非常有用,可以用不同的方法来解决问题。很明显,两者兼而有之的能力是最好的,Haskell确实提供了这一点,尽管它偏向于懒惰的一面,而不是严格的一面像大多数语言一样。
let lengths (xss: _ [] []) = Array.map (fun xs -> xs.Length) xss

let lengths (xss: _ [] []) = xss |> Array.map (fun xs -> xs.Length)
let lengths xss = Array.map (fun xs -> xs#length) xss