Functional programming 为什么我的类型不起作用?(使用类型&x27;a pred=&x27;a->;bool)

Functional programming 为什么我的类型不起作用?(使用类型&x27;a pred=&x27;a->;bool),functional-programming,sml,smlnj,Functional Programming,Sml,Smlnj,我在这个问题上纠缠了一段时间。我已经编辑、审查和更改了一段时间的类型,但我无法让类型检查器接受我正在做的事情,可能是因为我不完全理解错误/我在这方面出了什么错。我正在使用以下类型: - List.filter : 'a pred -> 'a list -> 'a list; > val 'a it = fn : ('a -> bool) -> 'a list -> 'a list 键入'a pred='a->bool 我相信这意味着我可以使用'a pred

我在这个问题上纠缠了一段时间。我已经编辑、审查和更改了一段时间的类型,但我无法让类型检查器接受我正在做的事情,可能是因为我不完全理解错误/我在这方面出了什么错。我正在使用以下类型:

- List.filter : 'a pred -> 'a list -> 'a list;
> val 'a it = fn : ('a -> bool) -> 'a list -> 'a list
键入'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)
我相信这意味着我可以使用pred作为表示bool的快捷方式

这是正确的

对于
isOdd
谓词,它是一个
intpred

> val isOdd = fn : int -> bool
- isOdd : int pred;
> val it = fn : int -> bool
也许您的误解在于,尽管表达了
:int pred
,REPL中的结果仍然被描述为
int->bool
?这是因为我们只定义了一个类型别名,而这些别名往往在SML中简化为非别名形式

或者你的误解在于
'a
降低到某个具体的值?通过不参考
'a
的具体值,可以使用
'a pred
进行操作。例如,如果要仅为给定的pred值过滤
'a list
,则标准函数
list.filter
将具有以下类型:

- List.filter : 'a pred -> 'a list -> 'a list;
> val 'a it = fn : ('a -> bool) -> 'a list -> 'a list
我不确定如何在保持多态类型的同时执行此函数(检查是否为奇数)

 fun isOdd (p : int) : bool  = 
    case p 
      of 1 => true
      | 0 => false
      | _ => isOdd (p - 2)
我也不确定

奇数是整数的属性,而不是任意类型的
'a


您需要首先将“奇”的含义扩展到任何类型。然后需要某种重载,因为每种类型的奇怪性可能不是由相同的机制决定的。我敢肯定这是一两次混乱造成的旁道。

我不明白你在问什么。首先,您开始谈论
键入'apred='a->bool
;然后显示一个根本没有引用
pred
的代码段,从周围的文本中,您似乎认识到该代码段的问题与
pred
无关。你能找出你真正的问题是什么,然后问那个问题吗?请随意删除问题中实际上不属于问题的任何部分。:-)问题在于你在哪里使用这个。我的直觉是你有
乐趣fx=。。。isOdd x…
,但您应该有
乐趣f p x=。。。p x…
,并将
isOdd
传递给该函数,但请阅读有关的内容。谢谢!我想我误解了我必须做的很多事情。对不起,我问了一个不容易回答的问题