1

我是 Haskell 的新手,想看看它是如何工作的。我想在 Haskell 中定义一个可以获取元组列表的函数,这些元组可以是对、3 元组、4 元组、5 元组等

functionY [(a,b)] 

然后我不能用三元组元素来调用它[(1,2,3),(2,3,4)]

functionY  [(1,2,3),(2,3,4)] // will complain 

我将如何解决这个问题?谢谢

4

1 回答 1

4

这是一种方法,如果您不介意编写一些样板代码,则该方法适用。从概念上讲,关于n元组的重要之处在于它是一个具有n个插槽的数据结构,您可以访问它。n >= m的每个 n 元组都应该有一个名为 get- m的方法,它可以获取第m个插槽中的任何数据。我们可以通过使用函数依赖将其抽象为类型类

{-# LANGUAGE FunctionalDependencies, FlexibleInstances #-}

class HasFirst a b | a -> b where
    get1 :: a -> b

class HasSecond a b | a -> b where
    get2 :: a -> b

这些类型类描述了具有“第一”和“第二”槽的数据。我们可以为 2 元组和 3 元组编写实例,如下所示

instance HasFirst (a,b) a where
    get1 (a,_) = a

instance HasSecond (a,b) b where
    get2 (_,b) = b

instance HasFirst (a,b,c) a where
    get1 (a,_,_) = a

instance HasSecond (a,b,c) b where
    get2 (_,b,_) = b

现在您可以编写一个对所有具有“第二个”插槽的数据结构通用的函数,例如

getSeconds :: HasSecond a b => [a] -> [b]
getSeconds = map get2

并按如下方式使用

>>> getSeconds [(1,2), (4,5)]
[2,5]
>>> getSeconds [(1,2,3), (4,5,6)]
[2,5]
于 2013-10-14T08:11:15.667 回答