为啥我的类型不起作用? (使用类型 'a pred = 'a -> bool)
Posted
技术标签:
【中文标题】为啥我的类型不起作用? (使用类型 \'a pred = \'a -> bool)【英文标题】:Why are my types not working out? (Use of type 'a pred = 'a -> bool)为什么我的类型不起作用? (使用类型 'a pred = 'a -> bool) 【发布时间】:2021-07-06 18:33:01 【问题描述】:我在这个问题上纠结了一段时间。我一直在编辑、审查和更改类型,但我无法让类型检查器接受我正在做的事情,可能是因为我不完全理解错误/我在哪里出错了。我正在使用以下类型:
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)
【问题讨论】:
我不明白你在问什么。首先你开始谈论type 'a pred = 'a -> bool
;然后您显示一个根本不引用pred
的代码sn-p,从周围的文本中,您似乎认识到该代码sn-p 的问题与pred
无关。你能弄清楚你的实际问题是什么,然后问那个问题吗?随意删除问题中实际上不属于您问题的任何部分。 :-)
问题出在你使用它的地方。我的直觉是你有fun f x = ... isOdd x ...
,但你应该有fun f p x = ... p x ...
,并将isOdd
传递给该函数,但请阅读minimal reproducible example。
【参考方案1】:
我相信这意味着我可以使用
'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
的具体值来操作'a pred
。例如,如果您想过滤 '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
。
您需要先将“奇数”的含义扩展到任何类型。然后你需要某种重载,因为每种类型的奇数可能不是由相同的机制决定的。我很确定这是由一两个混淆造成的。
【讨论】:
谢谢!我想我误解了我必须做的大量工作。抱歉,我问了一个不好回答的问题以上是关于为啥我的类型不起作用? (使用类型 'a pred = 'a -> bool)的主要内容,如果未能解决你的问题,请参考以下文章