我是Haskell的新手并试图了解它的工作原理。 我想在Haskell中定义一个可以获取元组列表的函数,这些元组可以是对,3元组,4元组,5元组等等
functionY [(a,b)]
然后我不能用像[(1,2,3),(2,3,4)]
functionY [(1,2,3),(2,3,4)] // will complain
我该如何解决这个问题? 谢谢
答案 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]