在OCaml中编写大型软件项目的最佳实践是什么?
你如何构建你的项目?
应该和不应该使用OCaml的哪些功能来简化代码管理?例外?一流的模块?GADTs?对象类型?
建立系统?测试框架?宬?
我找到了针对haskell的很好的建议,我认为为OCaml提供类似的东西会很好.
使用类型同义词系列的好处很明显 - 它是类型级函数.
但数据系列并非如此- 所以我的问题是,数据系列的用例是什么?我应该在哪里使用它?
我正在为Ocaml中的类似haskell的符号制作camlp4扩展,并试图找出GHC如何编译递归的do-bindings(使用-XDoRec启用).
我想知道monadic fixpoint combinator是否有可能以严格的语言存在(比如Ocaml/F#/ SML/...)?
如果是的话,它看起来怎么样?它会非常有用吗?
在Ocaml中,具有不同arities的元组具有不同的类型和值构造函数:
# let a = (1, 2, 3);;
val a : int * int * int = (1, 2, 3)
# let b = (1, (2, 3));;
val b : int * (int * int) = (1, (2, 3))
Run Code Online (Sandbox Code Playgroud)
注意,第二个例子(b)比第一个(a)更灵活,因为b - (2,3)的"尾部" - 本身是有效值:
# let (_, c) = b;;
val c : int * int = (2, 3)
# let d = snd b;;
val d : int * int = (2, 3)
Run Code Online (Sandbox Code Playgroud)
是什么原因不解析"(1,2,3)"为"(1,(2,3))"而是为不同的arities引入无限(或甚至更糟,有限)数量的新类型和值构造函数?
我刚刚读到了关于行多态性以及它如何用于可扩展记录和多态变体的内容.
但是,Ocaml使用子类型来处理多态变体.为什么?它比行多态更强大吗?
据我所知,值定义中的显式类型参数是克服"价值限制"问题的一种方法.
还有其他需要使用它们的情况吗?
Upd:我的意思是"显式通用构造",其中type参数包含在尖括号中,即
let f<'T> x = x
Run Code Online (Sandbox Code Playgroud)