F#.元组与否

use*_*514 9 f# types tuples matching

我刚开始学习F#.

我想知道如何确定函数的参数是否为元组?

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
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 15

FSharpType.IsTuple[MSDN]这样做.

let isTuple value = 
  match box value with
  | null -> false
  | _ -> FSharpType.IsTuple(value.GetType())
Run Code Online (Sandbox Code Playgroud)


Hen*_*olm 11

从技术上讲,可能有一种方法可以做到这一点,因为CLR支持运行时类型检查.但你不应该这样做.它违背了ML家族的多态性哲学 - 如果你需要这样的检查,它表明你的算法和/或数据结构设计不适合编程语言.(例外情况是,如果您需要与不遵循此原理的现有.net库进行交互).

更具体地说,参数多态性基于这样一个概念:每当你有一些你还不知道它是什么类型的东西时,这是因为你想要处理所有相同的东西而不是查看数据内部以查看它是什么.不遵循此规则相当于违背编程语言,并且会使您的代码更难理解,因为类型不会包含有关函数如何处理数据的常用信息.

如果你想创建一些你可以传递元组或单个数字的代码,并让代码知道差异,你应该定义一个显式的变体类型,这样你就可以使用模式匹配来分辨可能性,并且它将明确表示他们为调用者提供这种选择的函数类型.