首页 > 解决方案 > 接受多种类型的函数

问题描述

我对 f# 相当陌生,但我想知道是否可以创建一个接受多种类型变量的函数。

let add x y = x + y
let integer = add 1 2
let word = add "He" "llo"

一旦函数使用一种类型的变量,它就不能接受另一种类型的变量。

标签: f#

解决方案


您需要阅读有关静态解析类型参数内联函数的信息。它允许创建可以采用任何支持操作和/或具有成员的类型的函数。所以你的add函数应该这样定义:

let inline add x y = x + y

不要过度使用内联函数,因为它们的代码内联在调用站点中,并且可能会增加程序集大小,但可能会提高性能(测试每种情况,不要做出预测!)。此外,内联函数仅受 F# 编译器支持,可能不适用于其他语言(在设计库时很重要)。

SRTP 魔术示例

let inline (|Parsed|_|) (str: string) =
    let mutable value = Unchecked.defaultof<_>
    let parsed = ( ^a : (static member TryParse : string * byref< ^a> -> bool) (str, &value))
    if parsed then
        Some value
    else
        None

match "123.3" with
| Parsed 123 -> printfn "int 123"
| Parsed 123.4m -> printfn "decimal 123.4"
| Parsed 123.3 -> printfn "double 123.3"
// | Parsed "123.3" -> printfn "string 123.3" // compile error because string don't have TryParse static member
| s -> printfn "unmatched %s" s

推荐阅读