Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/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
F# 如何创建只接受int32或int64的函数_F# - Fatal编程技术网

F# 如何创建只接受int32或int64的函数

F# 如何创建只接受int32或int64的函数,f#,F#,如何在F#F中定义一个函数,该函数只接受一个被限制为int32或int64类型的参数x 超载 如果可以将函数定义为类方法,则可以使用普通的.NET方法重载: type Foo = static member Bar (x : int) = sprintf "32-bit integer: %i" x static member Bar (x : int64) = sprintf "64-bit integer: %i" x 金融服务机构示例: > Foo.Bar 42

如何在F#
F
中定义一个函数,该函数只接受一个被限制为
int32
int64
类型的参数
x

超载 如果可以将函数定义为类方法,则可以使用普通的.NET方法重载:

type Foo =
    static member Bar (x : int)   = sprintf "32-bit integer: %i" x
    static member Bar (x : int64) = sprintf "64-bit integer: %i" x
金融服务机构示例:

> Foo.Bar 42;;
val it : string = "32-bit integer: 42"
> Foo.Bar 42L;;
val it : string = "64-bit integer: 42"
> foo (NormalInt 42);;
val it : string = "32-bit integer: 42"
> foo (BiggerInt 42L);;
val it : string = "64-bit integer: 42"
歧视工会 如果需要将函数设置为let绑定函数,则不能使用方法重载。这将输入选项限制为
int
int64

type DUInt =
| NormalInt of int
| BiggerInt of int64
您可能应该想出一些更好的名称,但我选择避免使用
Int32
Int64
,因为这会使代码难以阅读,因为
系统
命名空间也将这些名称定义为类型

使用此区分并集,您可以编写一个将该类型的值作为输入的函数:

let foo = function
    | NormalInt x -> sprintf "32-bit integer: %i" x
    | BiggerInt x -> sprintf "64-bit integer: %i" x
此函数的类型为
DUInt->string

金融服务机构示例:

> Foo.Bar 42;;
val it : string = "32-bit integer: 42"
> Foo.Bar 42L;;
val it : string = "64-bit integer: 42"
> foo (NormalInt 42);;
val it : string = "32-bit integer: 42"
> foo (BiggerInt 42L);;
val it : string = "64-bit integer: 42"

有一种方法是在编译时限制它。首先创建函数的通用版本:

let inline twice x = x + x
然后使用重载解析和静态成员约束将其限制为所需类型:

type T = T with
    static member ($) (T, x:int  ) = twice x
    static member ($) (T, x:int64) = twice x

let inline restrictedTwice x = T $ x
测试:

restrictedTwice 4  //val it : int = 8

restrictedTwice 5L //val it : int64 = 10L

restrictedTwice 5u // doesn't compile

我不希望函数成为类成员,也不希望使用discriminatedunion@CarloV.Dango值得一提的问题——也许可以进一步解释一下预期的消费场景和/或你暴露的地方的性质it@RubenBartelink我认为“函数”一词意味着我没有创建方法;)是的,你在技术上是正确的,这个问题毫无悬念。然而事实是,这个简单问题的简单答案是“不,F#没有直接的支持,这对任何人都没有帮助”。在你的上下文中概述潜在可变性的参数将使人们在回答时更具创造性(在这种情况下,你发现有一个技巧很受欢迎,但可能在离你不远的地方有使用这种技术不适用的场景)@CarloV.Dango接受的答案不仅在输入类型上改变了功能,但也在返回类型上。这显然是这里的首选(这很好),但在其他情况下,可能需要一个可以处理不同输入的函数,但总是返回相同类型的结果。这是一种非常强大的技术,但请记住,它可能会大大降低编译速度。