所以基本上我正在获取一个项目列表并添加到元组列表中,以便更有效地存储/查看数据。我的代码是
TList :: [a] -> a -> [(a,Int)] -> [(a,Int)]
TList head [a] [] = [(head [a],1)]
TList head [a] ((a',i):xa)
|a' == take 1 = (head 1,i+1):xa
|otherwise = (a',i) : TList drop 1 [a] xa
所以我的逻辑是我取列表中的第一项,检查它是否已经在元组列表中,如果它是一个添加到int。再次调用该函数但没有第一个列表项 但它不断给出错误
Couldn't match expected type '[t1] -> a' with actual type '[a]'
它给出了这个错误5次,每行一次。
答案 0 :(得分:4)
所以,这不是你问题的完整答案,因为我不确定你究竟想要实现什么。但是代码有一些问题,我建议你先修复它们然后看看它是怎么回事:
函数名称需要以小写字母开头。因此,TList
不是函数的合法名称。 (类型和类型构造函数具有大写名称)。所以也许你想要tList
?
您正在命名其中一个参数head
。但head
也是Prelude
函数,您实际上似乎使用head
函数(head [a]
)。但是您的参数head
将影响头部功能。另外head
对于正确的列表来说似乎是一个奇怪的名字。
head [a]
似乎很奇怪head [a] == a
。所以只有一个元素的列表的头部总是那个元素。
我猜你正在尝试使用drop 1 [a]
(如果是的话,你缺少括号)。这也很奇怪,因为drop 1 [a] == []
。只有一个元素的列表的drop 1
始终是空列表。
您将第二个参数(类型a
)与[a]
进行模式匹配,但这不起作用,因为[a]
仅适用于列表类型[t]
a' == take 1
并没有多大意义。 take 1
需要一个列表作为第二个参数take 1 [1, 2, 3] = [1]
。因此,您要将a
类型的某些内容(a
)与[a] -> [a]
类型的take 1 :: [a] -> [a]
(@Override
public void onClick(View view) {
PopupWindow pw = new PopupWindow(View.inflate(MainActivity.this, R.layout.pop, null));
pw.setHeight(500); //any positive value
pw.setWindowLayoutMode(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
pw.showAsDropDown(findViewById(R.id.btn));
}
)进行比较。
答案 1 :(得分:0)
当你写道:
TList head [a] [] = ...
您已隐藏原始head
功能。因此,在这方面:
[(head [a],1)]
它试图评估它。我不知道为什么你只是在这里使用a
,代码非常不清楚,它不会用该名称编译(大写TList
),但是这个是这种类型不匹配的来源。