小编Fri*_*ice的帖子

通过“强制”键入角色和令人困惑的行为

我有一个类型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)

我缺少什么类型角色?

haskell roles coerce

11
推荐指数
1
解决办法
161
查看次数

Scala中具有两个参数的类型构造函数的函数实例

我有一个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 typeclass scalaz kind-projector

5
推荐指数
2
解决办法
371
查看次数

Scala:导致运行时错误的语法?

我正在学习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)

syntax scala semantics

0
推荐指数
1
解决办法
369
查看次数

标签 统计

scala ×2

coerce ×1

haskell ×1

kind-projector ×1

roles ×1

scalaz ×1

semantics ×1

syntax ×1

typeclass ×1