参数类型的推广

时间:2016-03-02 12:05:36

标签: haskell polymorphism

QVariant QStringListModel::data(const QModelIndex & index, int role) const

正如您所见,我的函数列出了divide_list :: Int -> [Int] -> [Int] -> [Int] -> ([Int], [Int]) divide_list n [] l r = (l,r) divide_list n (h:t) l r = if h <= n then divide_list n t (h:l) r else divide_list n t l (h:r) 。如何修改此代码以获得更通用的类型?我的意思是例如String等的列表。

2 个答案:

答案 0 :(得分:3)

为了使函数具有多态性,您需要在函数签名中指定类型变量。必须以小写形式指定类型变量,以将它们与特定类型区分开来,这些类型以大写形式指定。

 divide_list :: a -> [a] -> [a] -> [a] -> ([a], [a])

引自 Haskell的简要介绍教程:

  

Haskell还包含多态类型---类型   通过某种方式对所有类型进行普遍量化。多态型   表达式实质上描述了类型的族。例如,   (forall a)[a]是由每种类型a组成的类型的家族,   a的列表类型。整数列表(例如[1,2,3]),列表   字符([&#39; a&#39;,&#39; b&#39;&#39; c&#39;]),甚至是整数列表等列表,都是   这个家庭的所有成员。

在评论中提问后编辑:

请注意,在您的函数定义中,您使用<=。这是Ord类型类中定义的函数,因此您必须将多态类型约束为此类型类的实例。

divide_list :: (Ord a) => a -> [a] -> [a] -> [a] -> ([a], [a])

答案 1 :(得分:1)

您使用Int的唯一方面是给定hn,您可以计算h <= n。这是在Ord类型类中推广的,因此只要存在a实例,您的函数就可以在任何类型变量Ord a的选择上具有多态性:

divide_list :: (Ord a) => a -> [a] -> [a] -> [a] -> ([a], [a])