【发布时间】:2023-10-25 09:30:01
【问题描述】:
我有这个代码来过滤第一个字母是大写的字符串列表:
fun f s = Char.isUpper(String.sub(s,0));
fun only_capitals (xs : string list) = List.filter(f , xs);
但是编译的时候总是报错:
operator domain: 'Z -> bool
operand: (string -> bool) * string list
in expression:
List.filter (f,xs)
这个错误是什么意思?如何解决?
【问题讨论】:
-
这似乎是 Dan Grossman (Coursera/U Washington) 的编程语言作业 hw #3,问题 #1。 “编写一个函数
only_capitals,它接受一个字符串列表并返回一个字符串列表,该列表仅包含参数中以大写字母开头的字符串。假设所有字符串至少有1个字符。使用List.filter,Char.isUpper,和String.sub制作 1-2 行解决方案。” -
这可能值得参考 Grossman 的第 13 页导致这项作业的讲义。 “例如, List.foldl((fn (x,y) => x+y),0,[3,4,5]) 不会进行类型检查,因为 List.foldl 需要 'a * 'b -> 'b 函数,不是三元组。正确的调用是 List.foldl (fn (x,y) = x+y) 0 [3,4,5]..." 它使用柯里化,是推力。这也让我绊倒了好一阵子。
-
强大的一行:List.filter(fn x => Char.isUpper(String.sub(x, 0))) xs