我一直在尝试99个ocaml问题中的一个问题,你必须在列表中列出所有连续数字,例如[2; 3; 4; 4; 5; 6; 6; 6] - > [[2]; [3]; [4; 4]; [5] [6; 6; 6]]
let rec tail = function
| [] -> []
| [x] -> [x]
| x::xs -> tail xs;;
let pack lst =
let rec aux current acc = function
| [] -> current
| [x] -> if ((tail acc)=x) then ((x::acc)::current) else ([x]::current)
| x::y::xs -> if (x=y) then aux (current) (x::acc) (y::xs) else aux (acc::current) ([]) (y::xs)
in
aux [] [] lst;;
当我运行时,我得到错误
错误:此表达式的类型为“列表
”
但是表达式是'列表清单的类型
类型变量'a出现在'列表
我想知道问题是什么? 感谢任何帮助,它将受到极大的重视
答案 0 :(得分:0)
正如Bergi指出ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
}
int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
int desiredWidth = View.MeasureSpec.makeMeasureSpec(listView.getWidth(), View.MeasureSpec.AT_MOST);
Log.d("list", "" + listAdapter.getCount());
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
if (listItem != null) {
// This next line is needed before you call measure or else you won't get measured height at all. The listitem needs to be drawn first to know the height.
listItem.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
listItem.measure(desiredWidth, View.MeasureSpec.UNSPECIFIED);
totalHeight += listItem.getMeasuredHeight();
Log.d("total height", "" + totalHeight);
}
}
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
Log.d("params height", "" + params.height);
listView.setLayoutParams(params);
listView.requestLayout();
是问题所在。 tail返回(tail acc)=x
,因此x也必须是'a list
类型。以下'a list
然后推断acc必须是x::acc
类型。但'a list list
推断为tail acc
。
此时ocaml无法统一'a list
和'a list list
的tpyes并给出您看到的错误。