新手 scala 对身份类型签名感到困惑,啥都没有(底部)

Posted

技术标签:

【中文标题】新手 scala 对身份类型签名感到困惑,啥都没有(底部)【英文标题】:Newbie scala confused about identiy type signature, and nothing (bottom)新手 scala 对身份类型签名感到困惑,什么都没有(底部) 【发布时间】:2017-03-08 12:39:15 【问题描述】:

最好将我描述为 C#/F# + 一点业余 Haskell 程序员

我对 Scala 中的类型签名有点困惑。

例如

恒等函数有类型

Nothing => Nothing

(根据我的 intellij 中的 scala 控制台)

但对我来说这毫无意义。

身份的类型类似于..

all x . x => x

.....

所以

identity 1
=> x ~ Int 
=> 1 : Int

Nothing => Nothing

对我来说毫无意义....我希望在将任何值传递给期望 Nothing 的函数时输入异常!

显然我错过了什么。

【问题讨论】:

您的问题不清楚。 “身份功能”是什么意思? Scala 标准库中没有标识函数。它从哪里来的?它是如何定义的?注意:有一个identity method (not function) in the Scala standard library,类型签名def identity[A](x: A): A 和the implementation 是@inline def identity[A](x: A): A = x 【参考方案1】:

在 Scala 中,方法和函数值是有区别的。方法可以参数化,而值(函数或其他)不能。

所以标识方法是这样的:

def identity[A](x: A): A = x

它的类型为[A](x: A)A。但是如果你把它转换成这样的函数值:

val idFunction = identity _

idFunction 的类型为Nothing => Nothing。由于我没有为identity 提供类型参数,因此编译器推断为A = Nothing

你可以这样做:

val intIdentity = identity[Int] _

然后intIdentity 将具有类型Int => Int

【讨论】:

hmmmmm 但是“Nothing => Nothing”是一个非常奇怪的推断......它似乎显然是“错误的” 让我发布另一个问题....让我明白这个问题,关于我真正想写的内容【参考方案2】:

identity 函数在scala.PreDef 中定义,具有以下类型签名:

def identity[A](x: A): A

它接受一个类型参数A,一个类型为A的值,并返回它作为输入得到的内容。

在此处查看 scala.PreDef 的文档:scala.Predef

【讨论】:

那不是identity函数,那是identity方法。由于 OP 似乎至少有可能混淆方法和功能,并且这种混淆在他们的问题中起着重要作用,我认为进一步造成这种混淆并没有帮助。 Stack Overflow 上的 scala 标记中有足够的 questions,OP 对方法和函数之间的区别感到困惑,所以我们不要开始添加添加到这种混乱也是如此。 哇... 如此咆哮,因为我似乎只听错了一个词?你知道你可以编辑它吗?

以上是关于新手 scala 对身份类型签名感到困惑,啥都没有(底部)的主要内容,如果未能解决你的问题,请参考以下文章

对签署 android APK 感到困惑?

如何在 TypeScript 中添加索引签名

根据用户的类型,尝试进行身份验证并给予用户一定的权限。但啥都没有发生

对让Scala在IntelliJ中运行感到困惑?导入错误

对如何在 Blazor App 中从 B2C 获取访问令牌感到困惑

使用Scala宏无法解释的类型不匹配