F#。元组与否

时间:2011-11-27 02:31:27

标签: types f# 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

2 个答案:

答案 0 :(得分:15)

FSharpType.IsTuple[MSDN]这样做。

let isTuple value = 
  match box value with
  | null -> false
  | _ -> FSharpType.IsTuple(value.GetType())

答案 1 :(得分:11)

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

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

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