我是 Haskell 的新手,想看看它是如何工作的。我想在 Haskell 中定义一个可以获取元组列表的函数,这些元组可以是对、3 元组、4 元组、5 元组等
functionY [(a,b)]
然后我不能用三元组元素来调用它[(1,2,3),(2,3,4)]
functionY [(1,2,3),(2,3,4)] // will complain
我将如何解决这个问题?谢谢
我是 Haskell 的新手,想看看它是如何工作的。我想在 Haskell 中定义一个可以获取元组列表的函数,这些元组可以是对、3 元组、4 元组、5 元组等
functionY [(a,b)]
然后我不能用三元组元素来调用它[(1,2,3),(2,3,4)]
functionY [(1,2,3),(2,3,4)] // will complain
我将如何解决这个问题?谢谢
这是一种方法,如果您不介意编写一些样板代码,则该方法适用。从概念上讲,关于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]