Types 将OCaml转换为F#:如何转换OCaml格式模块的类型
我正在将OCaml转换为F#;看我的 为了开始,我换了衣服 字体大小 外部大小\u of_int:int->size=“%identity” 外部整数大小:size->int=“%identity” 到 让size\u of_int=sizeofTypes 将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#核中的某些函数。我也
还有一些我知道不正确的其他调整,但它允许我转换所有与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