新手 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 对身份类型签名感到困惑,啥都没有(底部)的主要内容,如果未能解决你的问题,请参考以下文章
根据用户的类型,尝试进行身份验证并给予用户一定的权限。但啥都没有发生