概括haskell中函数的方法签名。

时间:2013-10-14 05:17:51

标签: haskell

我是Haskell的新手并试图了解它的工作原理。 我想在Haskell中定义一个可以获取元组列表的函数,这些元组可以是对,3元组,4元组,5元组等等

functionY [(a,b)] 

然后我不能用像[(1,2,3),(2,3,4)]

这样的3元组元素来调用它
functionY  [(1,2,3),(2,3,4)] // will complain 

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

1 个答案:

答案 0 :(得分:4)

这是一种方法,如果你不介意编写一些样板代码,这是合适的。从概念上讲,关于 n -tuple的所有重要事项是它是一个具有 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]