F#. 元组还是不用?

9

我刚开始学习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个回答

15

FSharpType.IsTuple[MSDN]实现了这个功能。

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

11

从技术上讲,可能有一种方法可以做到这一点,因为CLR支持运行时类型检查。但你不应该想这样做。这违反了ML家族的多态性哲学——如果你需要这样的检查,说明你的算法和/或数据结构设计不适合编程语言。(异常情况是如果你需要与不遵循这种哲学的现有.NET库进行接口)。

更具体地说,参数多态性基于这样一个概念:每当你拥有某些你还不知道其类型的东西时,那是因为你希望以相同方式处理所有内容,而不是查看数据内部以确定其类型。不遵循这个规则相当于逆着编程语言的思路工作,并且会使你的代码更难理解,因为类型将不提供通常有关函数如何处理数据的信息。

如果你想创建一些代码,可以传递元组或单个数字,并使该代码意识到差异,那么你应该定义一个明确的“变量类型”,以便你可以使用模式匹配区分可能性,并且它将在函数的类型中明确提供给调用者这样的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接