小编pur*_*efn的帖子

具有RankNTypes的newtype

如果我想声明一个newtype类型的类型被约束为具有类型类的实例,我似乎可以这样做:

{-# LANGUAGE RankNTypes #-}

newtype ShowBox = ShowBox (forall a. Show a => a)
Run Code Online (Sandbox Code Playgroud)

GHC编译就好了,但是当我尝试并实际使用ShowBox

ShowBox "hello"
Run Code Online (Sandbox Code Playgroud)

我收到编译器错误

<interactive>:1:18:
    Could not deduce (a ~ [Char])
    from the context (Show a)
      bound by a type expected by the context: Show a => a
      at <interactive>:1:10-24
      `a' is a rigid type variable bound by
          a type expected by the context: Show a => a at <interactive>:1:10
    In the first argument of `ShowBox', namely `"hello"'
    In the expression: …
Run Code Online (Sandbox Code Playgroud)

haskell higher-rank-types newtype

17
推荐指数
2
解决办法
507
查看次数

是否可以使用与非托管源不同的编译器标志编译托管源?

我已经添加了-Xlinter-Ywarn-unused-importscalac标志,以我的一个项目.问题是我正在使用源生成器并且它创建的代码不能通过所有检查 - 有死代码和未使用的导入警告.有没有办法让我有一套不同的scalacOptions托管代码和非托管代码?

scala sbt

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

依赖方法类型和类型类

我有一堆看起来完全相同的数据存储类型.

trait FooStore[C] {
  def create(f: FooId => Foo)(c: C): Foo
  // update and find methods
}
Run Code Online (Sandbox Code Playgroud)

我想简化一些事情,并希望使用依赖方法类型来获得更接近的东西

sealed trait AR {
  type Id
  type Type
}

sealed trait FooAR extends AR {
  type Id = FooId
  type Type = Foo
}

trait DataStore[C] {
  def create(ar: AR)(f: ar.Id => ar.Type)(c: C): ar.Type
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试创建一个如下的实例时

case class InMemory(foos: List[Foo])
object InMemory {
  lazy val InMemoryDataStore: DataStore[InMemory] = new DataStore[InMemory] {
    def create(ar: AR)(f: ar.Id => ar.Type)(c: InMemory): ar.Type = sys.error("not …
Run Code Online (Sandbox Code Playgroud)

scala typeclass dependent-method-type

8
推荐指数
1
解决办法
1020
查看次数

你如何在sbt中组成任务?

我正在尝试构建一个自定义任务,用于在我们的持续集成环境中构建项目.这是一系列的步骤

  1. 将构建开始消息发送到聊天室
  2. 编译模板
  3. 运行npm测试
  4. 运行jshint
  5. 构建应用程序工件
  6. 将工件上载到我们的部署服务器
  7. 运行测试
  8. 将测试结果发送到我们的部署服务器
  9. 将构建结果消息发送到聊天室

请注意,如果任何步骤失败,则应该执行步骤10,并且应根据哪个步骤失败来自定义消息,例如,如果步骤5失败,则应说"编译失败",如果步骤8失败,则应说明运行了多少测试并且多少失败了.

为了使事情更有趣,这是一个多项目构建,因此在运行测试和发布结果时,它应该运行所有测试并发布聚合结果.

为了使事情变得更有趣,npm测试,jshint和工件只webapp在Javascript存在且Web服务器所在的子项目中才有意义.

我一直在寻找sbt-release的灵感,但我在如何获取一个任务产生的值并在下一个任务中使用它,如何在聚合中运行任务并获得生成的值(我看到一个方法Extracted来运行集中的任务,但它并没有给生产值),如何在一个子项目运行任务,并获得生产价值,以及如何做错误处理.

到目前为止,我尝试了两种方法

npmTest.result.value match {                                                                    
  case Inc(inc) =>                                                                              
    println(inc)                                                                                
  case Value(res) => Def.taskDyn {                                                              
    (executeTests in Test).result.value match {                                                 
      case Inc(inc) =>                                                                          
        println(inc)                                                                            
      case Value(res) =>                                                                        
        println(res)                                                                            
    }                                                                                           
  }
Run Code Online (Sandbox Code Playgroud)

上述问题是executeTests即使npmTest失败也始终运行.并且没有一个println被执行.

npmTest.result.                                                                                    
 flatMap {-                                                                                       
   case Inc(inc) =>                                                                               
     task { println(inc) }                                                                        
   case Value(res) =>-                                                                            
     (executeTests in Test).result.                                                               
       flatMap {                                                                                  
         case Inc(inc) =>                                                                         
           task { println(inc) }                                                                  
         case …
Run Code Online (Sandbox Code Playgroud)

scala sbt

7
推荐指数
1
解决办法
462
查看次数

在Scala中的'Data types ala Carte'中编写foldTerm

我正在尝试foldTerm从Scala中的数据类型ala Carte编写函数.这是我到目前为止所得到的

def foldTerm[F[+_], A, B](e: Free[F, A], pure: A ? B, imp: F[B] ? B)(implicit F: Functor[F]): B =
  e.resume match { 
    case Right(a) ? pure(a)
    case Left(x)  ? imp(F.map(x)(foldTerm(_, pure, imp)))
}
Run Code Online (Sandbox Code Playgroud)

这可行,但由于Scala无法正确优化尾递归,因此会导致SOE.我试图解决它,Trampoline但到目前为止还没有运气.我觉得我应该能够用现有的方法做到这一点,Free但我的所有尝试都以失败告终.

我错过了什么?

scala scalaz

5
推荐指数
1
解决办法
179
查看次数