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等的列表。
答案 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
的唯一方面是给定h
和n
,您可以计算h <= n
。这是在Ord
类型类中推广的,因此只要存在a
实例,您的函数就可以在任何类型变量Ord a
的选择上具有多态性:
divide_list :: (Ord a) => a -> [a] -> [a] -> [a] -> ([a], [a])