f# - 接受多种类型的函数
问题描述
我对 f# 相当陌生,但我想知道是否可以创建一个接受多种类型变量的函数。
let add x y = x + y
let integer = add 1 2
let word = add "He" "llo"
一旦函数使用一种类型的变量,它就不能接受另一种类型的变量。
解决方案
您需要阅读有关静态解析类型参数和内联函数的信息。它允许创建可以采用任何支持操作和/或具有成员的类型的函数。所以你的add
函数应该这样定义:
let inline add x y = x + y
不要过度使用内联函数,因为它们的代码内联在调用站点中,并且可能会增加程序集大小,但可能会提高性能(测试每种情况,不要做出预测!)。此外,内联函数仅受 F# 编译器支持,可能不适用于其他语言(在设计库时很重要)。
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
推荐阅读
- arrays - 将大值传递给模块
- r - 如何按特定范围和有条件地对行进行分组?
- node.js - 将浏览器连接到 NodeJS IPFS 节点
- javascript - 获取选中的 contenteditable 类,动态生成 contenteditables
- python - 我们如何在 pyspark 的不同模块中使用相同的连接数据框用法
- c - 在c编程中,我不能输入超过78的输入。之后 I/O 不起作用。有没有办法输入更多的输入?
- php - 我们如何反序列化从数据库中检索的 WordPress 复杂嵌套对象字符串
- r - 更新 R 中数据框中的特定变量
- flutter - 如何在 Flutter 中创建自定义下拉框
- python - sqlalchemy OverflowError:太大而无法使用 dataframe.to_sql 进行转换