Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types 将OCaml转换为F#:如何转换OCaml格式模块的类型_Types_F#_Ocaml_External - Fatal编程技术网

Types 将OCaml转换为F#:如何转换OCaml格式模块的类型

Types 将OCaml转换为F#:如何转换OCaml格式模块的类型,types,f#,ocaml,external,Types,F#,Ocaml,External,我正在将OCaml转换为F#;看我的 为了开始,我换了衣服 字体大小 外部大小\u of_int:int->size=“%identity” 外部整数大小:size->int=“%identity” 到 让size\u of_int=sizeof 还有一些我知道不正确的其他调整,但它允许我转换所有与open_-box和close_-box相关的代码,除了这三行代码 现在我必须改变这三行,这样我就可以测试我转换的格式模块的子集 我知道大小为_的行和大小为_的外部行可能依赖于F#核中的某些函数。我也

我正在将OCaml转换为F#;看我的

为了开始,我换了衣服

字体大小

外部大小\u of_int:int->size=“%identity”

外部整数大小:size->int=“%identity”

让size\u of_int=sizeof

还有一些我知道不正确的其他调整,但它允许我转换所有与open_-box和close_-box相关的代码,除了这三行代码

现在我必须改变这三行,这样我就可以测试我转换的格式模块的子集

我知道大小为_的行和大小为_的外部行可能依赖于F#核中的某些函数。我也知道在转换过程中可能会忽略这一点

我最好的猜测是,我只需要创建一个名为size的简单类型,size_为int,int_为size,但是如何创建呢

编辑

根据我的回答,我能够创建以下F#代码

这使我的格式模块子集能够成功编译

编辑

,其回答如下,其版本位于 我还没有测试过,但它是我目前发现的最完整的版本。

以下几行:

type size
external size_of_int : int -> size = "%identity"
external int_of_size : size -> int = "%identity"
创建与int相同的抽象类型。转换函数 没有ops(标识功能)。我不知道F#的成语,但在 OCaml您可以使用接口文件,避免使用“%identity”的巧妙之处


希望这更容易翻译成F#。

作为参考,还有另一种更安全的方法可以在F#中处理此代码:使用度量单位类型注释

当您在F#中编写
type size=int
时,
size
只是
int
的别名,因此F#编译器将很乐意允许您混合和匹配它们。例如:

let someSize : size = 10
let badSum = someSize + 3  // 'someSize' is used like another other 'int'
如果您想要更大的类型安全性,可以定义度量单位类型
Size
,并如下使用:

[<Measure>] type Size
type size = int<Size>

let inline size_of_int i =
    LanguagePrimitives.Int32WithMeasure<Size> i
let inline int_of_size s = int s

// Now, using a variable of type 'size' where an 'int' is expected
// (or vice versa) will result in a compilation error.
let someSize = size_of_int 10
let badSum = someSize + 3  // compilation error here
[]类型大小
类型大小=int
让内联大小为=
LanguagePrimitives.int32带度量值i
让内联int_的大小为s=int s
//现在,使用一个类型为“size”的变量,其中需要一个“int”
//(反之亦然)将导致编译错误。
设someSize=10的大小
这里让badSum=someSize+3//编译错误
如果您是从OCaml来到F#,这可能有点熟悉。F#中的度量单位类型在编译时被删除,但它们有助于减少代码中的简单数学错误——幻影类型也可以在OCaml中用于相同的目的

let someSize : size = 10
let badSum = someSize + 3  // 'someSize' is used like another other 'int'
[<Measure>] type Size
type size = int<Size>

let inline size_of_int i =
    LanguagePrimitives.Int32WithMeasure<Size> i
let inline int_of_size s = int s

// Now, using a variable of type 'size' where an 'int' is expected
// (or vice versa) will result in a compilation error.
let someSize = size_of_int 10
let badSum = someSize + 3  // compilation error here