Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types F#。元组与否_Types_F#_Tuples_Matching - Fatal编程技术网

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())