可能重复:
在功能编程中,什么是仿函数?
我对OCaml了解不多,我已经研究了F#一段时间并且非常了解它.
他们说F#错过了函数模型,它存在于OCaml中.我试图弄清楚究竟是什么算子,但维基百科和教程对我没什么帮助.
你能为我阐明这个谜吗?提前致谢 :)
编辑:
对于帮助过我的每个人,我都明白了这一点.您可以将问题完全复制为:在函数式编程中,什么是仿函数?
我听说OCaml 3.12中有"头等舱模块".它们有什么优势?什么孩子的事情会更容易?他们试图解决什么问题?一个简单的例子就足够了.
我正在草拟一些设计(函数的机器学习),它最好是想要一种函数式编程语言,还有内省,特别是以一些易于处理的格式检查程序自己的代码的能力,最好还有获取机器的能力.生成的代码是在运行时编译的,我想知道什么是编写它的最佳语言.Lisp当然具有强大的内省功能,但静态类型语言也有优势; 我正在考虑的是:
F# - .Net平台在这里有一个很好的故事,你可以在运行时读取字节码,也可以发出字节码并进行编译; 我假设从F#访问这些设施没有问题.
Haskell,Ocaml - 通过字节码或解析树,它们有类似的功能吗?
还有其他语言我还应该关注吗?
这就是我到目前为止所拥有的.这不就是你需要的吗?我一直收到错误"错误:未绑定模块标准"
let r file =
let chan = open_in file in
Std.input_list (chan)
Run Code Online (Sandbox Code Playgroud) 合成对我来说一般(例如,如果我编辑C/C++文件然后我得到语法错误通知),但我无法让它显示语法错误OCaml.
我的OCaml安装似乎没问题,并且Syntastic ocaml.vim文件头中提到的二进制文件在我的路径中.
有任何想法吗?
OCaml 对于多态类型注释有几种不同的语法:
\nlet f : \'a -> \'a = \xe2\x80\xa6 (* Isn\xe2\x80\x99t this one already polymorphic? (answer: NO) *)\nlet f : \'a. \'a -> \'a = \xe2\x80\xa6\nlet f : type a. a -> a = \xe2\x80\xa6\nRun Code Online (Sandbox Code Playgroud)\n当使用奇特的代数数据类型(通常是 GADT)时,我们经常会看到它们,它们似乎是必要的。
\n这些语法有什么区别?何时以及为何必须使用每一项?
\n有时我仍然试图将过程代码转换为功能代码.
是否有一个功能成语/片段列表映射到程序习语/片段?
编辑
由于似乎没有这些片段的集中式网站,我将其转变为社区维基.请在此粘贴任何程序 - >功能片段.
正如Moggi 20年前提出的->那样,ML等语言的有效函数空间可以分解为标准的总函数空间=>加上强大的monad T来捕获效果.
A -> B 分解为 A => (T B)
现在,Haskell支持monad,包括一个看起来足以用于ML中的效果的IO monad,它有一个包含=>(但也包括部分函数)的函数空间.因此,我们应该能够通过这种分解将相当大的ML片段转换为Haskell.从理论上讲,我觉得这很有效.
我的问题是这样的嵌入是否可行:是否有可能设计一个Haskell库,允许在Haskell中以不远离ML的方式编程?如果是这样,性能将如何?
我对"实用"的标准是,具有广泛的使用效果现有ML代码可以通过嵌入相对容易地转录成Haskell中,包括涉及高阶函数复杂的案件.
为了具体化,我自己尝试通过嵌入进行这样的转录.主要功能是转录一些简单的ML代码,强制生成5个不同的变量名.而不是直接使用的分解,让他们评估他们的论点我的版本提升功能-之前的定义,main是一个小型图书馆,包括解除原语.这项工作没问题,但有些方面并不完全令人满意.
val.具有功能(如未提升的版本rdV),将有助于这一点,在这些要求中定义的成本.varNum需要monadic绑定通过<-a do.然后,这会强制任何依赖于它们的定义也在同一个do表达式中.do表达.这是ML程序是如何经常考虑,但在Haskell它不是那么很好的支持-例如,你不得不使用case,而不是公式.那么,有关改进这一点的建议,或者使用相同分解的更好方法,甚至是使用反映ML的样式在Haskell中实现相同的编程目标的完全不同的方法?(并不是我不喜欢Haskell的风格,只是因为我希望能够轻松地映射现有的ML代码.)
import Data.IORef
import Control.Monad
val :: Monad m => a -> m a
val = return
ref = join . liftM newIORef
rdV = readIORef -- Unlifted, hence takes a value
(!=) r x = …Run Code Online (Sandbox Code Playgroud) 我怎么能把浮点数转换为OCaml中的整数?
我知道如何从int获取一个浮点数,但似乎没有一种简单的方法可以从浮点数中获取一个int.
我突然开始得到这个错误.我不知道如何诊断或修复它.我是否应该通过grep bar.ml检查每个Big_int函数以防止签名Big_int.mli?
File "foo.ml", line 1, characters 0-1:
Error: The files /home/bar.cmi
and /usr/lib/ocaml/big_int.cmi make inconsistent assumptions
over interface Big_int
Run Code Online (Sandbox Code Playgroud)