我有一个类型Id a,我试图防止意外强制,例如, anId Double到 an Id Int。
如果我正确理解类型角色,则不应编译以下内容。
{-# LANGUAGE RoleAnnotations #-}
import Data.Coerce (coerce)
type role Id nominal
newtype Id a = Id String
badKey :: Id Int
badKey = coerce (Id "I point to a Double" :: Id Double)
Run Code Online (Sandbox Code Playgroud)
不幸的是,它确实:
Prelude> :load Id.hs
[1 of 1] Compiling Main ( Id.hs, interpreted )
Ok, one module loaded.
*Main> :type badKey
badKey :: Id Int
Run Code Online (Sandbox Code Playgroud)
我缺少什么类型角色?
我有一个Foo带有两个参数的类,我正在尝试为Foo编写一个Functor实例,并修复了第一个参数,如下所示:
object Scratchpad {
trait Functor[F[_]] {
def fmap[A, B](f: A => B): F[A] => F[B]
}
case class Foo[X, Y](value: Y)
implicit def fooInstances[X]: Functor[Foo[X, _]] =
new Functor[Foo[X, _]] {
def fmap[A, B](f: A => B): Foo[X, A] => Foo[X, B] =
foo => Foo[X, B](f(foo.value))
}
}
Run Code Online (Sandbox Code Playgroud)
但上面的代码无法编译,生成以下错误:
Error:(9, 41) Scratchpad.Foo[X, _] takes no type parameters, expected: one
implicit def fooInstances[X]: Functor[Foo[X, _]] =
Run Code Online (Sandbox Code Playgroud)
我知道Scalaz用它们的\/类型做了类似的事情,但是对它们的源代码的检查显示出一个奇怪的?,它不能为我编译:
implicit def DisjunctionInstances1[L]: Traverse[L \/ ?] …Run Code Online (Sandbox Code Playgroud) 我正在学习Scala并尝试编写一些命令行可执行文件.
我有两个版本的HelloWorld,我认为它在语义上是相同的.HelloWorld.scala从命令行成功编译并运行.HelloWorld2.scala编译但产生运行时错误.
我的问题:我认为两者在语义上是相同的,那么为什么第二个会产生运行时错误?
这是工作示例:
// HelloWorld.scala
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello, World!")
}
}
Run Code Online (Sandbox Code Playgroud)
这是破碎的例子:
// HelloWorld2.scala
object HelloWorld2 {
def main
: Array[String] => Unit
= args => {
println("Hello, World!")
}
}
Run Code Online (Sandbox Code Playgroud)
这是控制台输出:
java.lang.NoSuchMethodException: HelloWorld2.main([Ljava.lang.String;)
at java.lang.Class.getMethod(Class.java:1778)
at scala.reflect.internal.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:66)
at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:101)
at scala.tools.nsc.CommonRunner$class.run(ObjectRunner.scala:22)
at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:39)
at scala.tools.nsc.CommonRunner$class.runAndCatch(ObjectRunner.scala:29)
at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:39)
at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:65)
at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:87)
at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:98)
at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:103)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
Run Code Online (Sandbox Code Playgroud)