问题描述
我被这个问题困住了一段时间。我一直在编辑、审查和更改类型一段时间,但我无法让类型检查器接受我正在做的事情,可能是因为我不完全理解错误/我哪里出错了。我正在使用类型:
type 'a pred = 'a -> bool
我相信这意味着我可以使用 'a pred
作为表示 'a -> bool
的快捷方式,因此在我的情况下 int 将导致 bool,但我不完全了解如何实现它因为我在网上找不到很多我已经检查过的例子。
我的最新版本如下,但我从检查器中收到了一些错误,包括错误:运算符和操作数不一致。有人能解释一下我的错误在哪里,为什么吗?
编辑:我现在认为此函数与其余代码之间存在不匹配。其余的代码要求它是一个 'a,多态的,而在这里我假设它是一个 int。但是,我不确定如何在保持多态类型的同时执行此功能(检查是否为奇数)。
fun isOdd (p : int) : bool =
case p
of 1 => true
| 0 => false
| _ => isOdd (p - 2)
解决方法
我相信这意味着我可以使用 'a pred
作为表示 'a -> bool
的快捷方式
没错。
就您的 isOdd
谓词而言,它是一个 int pred
:
> val isOdd = fn : int -> bool
- isOdd : int pred;
> val it = fn : int -> bool
也许你的误解在于,尽管表达了 : int pred
,但 REPL 中的结果仍然被描述为 int -> bool
?这是因为我们只定义了一个类型别名,而那些在 SML 中往往会简化为非别名形式。
或许您的误解在于将 'a
减少到某个具体值?您可以通过不引用 'a pred
的具体值来操作 'a
。例如,如果您只想为给定 'a list
的真值过滤 'a pred
,那么标准函数 List.filter
将具有以下类型:
- List.filter : 'a pred -> 'a list -> 'a list;
> val 'a it = fn : ('a -> bool) -> 'a list -> 'a list
我不确定如何在保持多态类型的同时执行此函数(检查是否为奇数)。
我也不确定。
奇数是整数的属性,而不是任意类型 'a
。
您需要首先将“奇数”的含义扩展到任何类型。然后你需要某种重载,因为每种类型的奇怪可能不是由相同的机制决定的。我很确定这是由一两个混淆引起的旁道。