这是一个(系列)Haskell 问题。我对 Haskell 相当陌生。
假设我们有一个 4 元组 (a1,a2,a3,a4)。我们如何定义一个函数,kth
给出这个元组中的第 k 个元素?例子,
kth (1,"A",'b',True) 3 = 'b'
如果a1、a2、a3、a4的类型相同,那么它的定义就比较简单了。例如,如果它们都是整数:
kth :: (Int,Int,Int,Int) -> Int -> Int
kth (a1,a2,a3,a4) 1 = a1
kth (a1,a2,a3,a4) 2 = a2
kth (a1,a2,a3,a4) 3 = a3
kth (a1,a2,a3,a4) 4 = a4
我怀疑为什么这不简单是因为 Haskell 必须提前知道类型。在库函数fst
andsnd
中,Haskell 知道输出类型是形式的第一个元素的类型,输出类型是后者的第二个元素的类型。因此,没有歧义。在kth
中,输出类型取决于第二个输入,因此 Haskell 无法根据语法进行类型检查。
现在,假设我们有一个第 n 个元组 (a1,a2,...,an)。我们可以定义一个长度函数族,使得
lengthTuple :: a -> Int
lengthTuple (a1,a2,...,an) = n