为啥我的类型不起作用? (使用类型 '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)的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ul 列表中的第一个类型不起作用

为啥我的 UICollectionView 大纲不起作用?

短到 Int 类型转换不起作用,为啥?

为啥输入类型=“url”验证不起作用

为啥类型转换在 Swift 2.0 中不起作用?

为啥 == 在比较具有相同 int 值的两个对象类型变量时不起作用