我想知道是否有可能在OCaml中构建类似于多个调度的东西.为此,我尝试为多方法的输入签名创建一个显式类型.例如,我定义了一个数字类型
type _ num =
| I : int -> int num
| F : float -> float num
Run Code Online (Sandbox Code Playgroud)
现在我想要一个函数add来求和a 'a num和a 'b num并返回一个int numif 'a和'bare int,并且float num如果它们中至少有一个是a float.此外,类型系统应该知道输出将使用哪个构造函数.也就是说,在函数调用中应该静态地知道输出是类型int num的.
那可能吗?到目前为止,我只能管理签名函数type a b. a num * b num -> a num,因此总是必须提供(更一般的)float作为第一个参数.int num * float num必须不允许这种情况,导致非穷举模式匹配和运行时异常.
似乎需要一个签名,例如type a b. a num * b num -> c(a,b) numwhere c类型函数包含类型提升规则.我不认为OCaml有这个.打开的类型或对象能够捕获这个吗?我不是在寻找类型之间最常用的函数,如果我可以明确地列出少数输入类型组合和相应的输出类型就足够了.
假设我有自己的数据结构,作为一个愚蠢的例子
type 'a mylist = Empty | Cons of 'a * ('a mylist).
我想在表格中打印这个列表{a,b,...}.这里a,b类型'a是根据安装在带有#install_printer的顶层中的打印功能打印的,或者如果没有可用的打印功能,则为<abstr>.
我知道我将如何定义单态MYLIST打印功能,但有一个多态的方式来告诉只是把顶层{,,并}与使用它已经知道该之间来在任何类型的?
这与这个问题类似但不完全相同。
我天真地尝试过这个:
let s prec = "%." ^ (string_of_int prec) ^ "f" in
Printf.printf (s 2) 1.23
Run Code Online (Sandbox Code Playgroud)
但这被拒绝了,并被替换^为^^. 有什么办法可以做到这一点吗?
我正在尝试使用来自OCaml的一个小型自包含fortran库中的函数.我可以用它编译库gfortran -shared mvndst.f -o sharedlib.调用nm sharedlib显示符号列表,例如... T _mvndfn_.
在阅读了ctypes教程示例https://github.com/ocamllabs/ocaml-ctypes/wiki/ctypes-tutorial后,我试着做类似的事情let mvndfn = foreign "mvndfn" (ptr double @-> returning float).找不到符号.也许并不奇怪,因为我没有告诉它在哪里看 - 但我不知道如何.
这可以吗?如何告诉toploop寻找这个共享库?它是Fortran而不是C是否重要?如果程序在toploop中工作,我如何最终编译和链接程序?
(这是在OS X上)