头函数抛出类型匹配错误Haskell

时间:2015-10-19 10:12:25

标签: haskell functional-programming

所以基本上我正在获取一个项目列表并添加到元组列表中,以便更有效地存储/查看数据。我的代码是

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次,每行一次。

2 个答案:

答案 0 :(得分:4)

所以,这不是你问题的完整答案,因为我不确定你究竟想要实现什么。但是代码有一些问题,我建议你先修复它们然后看看它是怎么回事:

  1. 函数名称需要以小写字母开头。因此,TList不是函数的合法名称。 (类型和类型构造函数具有大写名称)。所以也许你想要tList

  2. 您正在命名其中一个参数head。但head也是Prelude函数,您实际上似乎使用head函数(head [a])。但是您的参数head将影响头部功能。另外head对于正确的列表来说似乎是一个奇怪的名字。

  3. head [a]似乎很奇怪head [a] == a。所以只有一个元素的列表的头部总是那个元素。

  4. 我猜你正在尝试使用drop 1 [a](如果是的话,你缺少括号)。这也很奇怪,因为drop 1 [a] == []。只有一个元素的列表的drop 1始终是空列表。

  5. 您将第二个参数(类型a)与[a]进行模式匹配,但这不起作用,因为[a]仅适用于列表类型[t]

  6. 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),但是这个是这种类型不匹配的来源。