Types F#。元组与否
我刚开始学法语 我想知道如何确定函数的参数是否是元组Types F#。元组与否,types,f#,tuples,matching,Types,F#,Tuples,Matching,我刚开始学法语 我想知道如何确定函数的参数是否是元组 let tuple = (1, 2) let notTuple = 3 let isTuple t = // returns 'true' if t is a tuple, 'false' otherwise printfn "%b" isTuple tuple // true printfn "%b" isTuple notTuple // false 从技术上讲,可能有一种方法可以做到这一点,因为CLR支持运行时类型
let tuple = (1, 2)
let notTuple = 3
let isTuple t = // returns 'true' if t is a tuple, 'false' otherwise
printfn "%b" isTuple tuple // true
printfn "%b" isTuple notTuple // false
从技术上讲,可能有一种方法可以做到这一点,因为CLR支持运行时类型检查。但你不应该这么做。这与ML家族的多态性哲学背道而驰——如果您需要这样的检查,则表明您的算法和/或数据结构设计不适合编程语言。(例外情况是,如果您需要与不遵循此原则的现有.net库进行接口) 更具体地说,参数多态性是基于这样一个概念,即当您拥有一些您还不知道它是什么类型的东西时,这是因为您希望以相同的方式处理所有事情,而不是查看数据内部以查看它是什么。不遵循这条规则相当于违背编程语言的基本原则,并且会使代码更难理解,因为类型不会包含有关函数如何处理数据的常规信息 如果您想创建一些可以传递元组或单个数字的代码,并让这些代码意识到差异,那么应该定义一个显式的变量类型,这样您就可以使用模式匹配区分各种可能性,它们为调用者提供这样一个选择的函数类型是明确的。就是这样做的
let isTuple value =
match box value with
| null -> false
| _ -> FSharpType.IsTuple(value.GetType())