Haskell或特定编译器是否具有类型级lambda(如果这甚至是一个术语)?
详细说,我说有一个参数化类型,Foo a b
并希望Foo _ b
成为一个实例,比如Functor.是否有任何机制可以让我做类似的事情
instance Functor (\a -> Foo a b) where
...
Run Code Online (Sandbox Code Playgroud)
?
我有一个看起来像这样的课:
class X[A <: Throwable, B, C](b: B, c: C)
Run Code Online (Sandbox Code Playgroud)
可以推断出A,B和C,所以我可以用以下方法实例化它:
val x = new X(3, 4)
Run Code Online (Sandbox Code Playgroud)
这给了我一个X [Nothing,Int,Int] - 经常是我想要的.
但我有时想将A指定为Nothing以外的东西(比如说AssertionError).如果没有指定B和C,这是否可行.我想象的语法如下:
val x = new X[AssertionError](3, 4)
val x = new X[AssertionError, _, _](3, 4)
val x = new X[AssertionError,,](3, 4)
Run Code Online (Sandbox Code Playgroud)
但显然这不起作用.
是否有一些语法,或者某种方式我可以达到相同的结果?
我试图理解下面的一段代码(来自Scalaz库):
def kleisliIdApplicative[R]: Applicative[Kleisli[Id, R, ?]] = ...
Run Code Online (Sandbox Code Playgroud)
我假设表单T[P0, ?]
的类型是一个带参数的类型构造函数.但是,我无法找到解释类型参数中问号用法的文档.
一个相关的问题是问号和下划线之间有什么区别?
是否存在所有这些都有详细记录的地方?
如何解决这种类型的定义:Pure[({type ?[a]=(R, a)})#?]
?
使用这种结构的原因是什么?
Snipped来自scalaz库:
trait Pure[P[_]] {
def pure[A](a: => A): P[A]
}
object Pure {
import Scalaz._
//...
implicit def Tuple2Pure[R: Zero]: Pure[({type ?[a]=(R, a)})#?] = new Pure[({type ?[a]=(R, a)})#?] {
def pure[A](a: => A) = (Ø, a)
}
//...
}
Run Code Online (Sandbox Code Playgroud) 在Scala中调用带有类型参数的方法时,我经常尝试安排代码,以便类型推断器可以找到关于类型参数的自己,而不需要我填写它们.在某些情况下,它失败了,我必须手动提供它们.
大多数情况下,这不是问题,但对于具有多个类型参数的方法(例如,大多数方法需要隐式CanBuildFrom
),我想知道是否有一种方法可以帮助类型推理器,只给它一个所需类型参数,并要求它尝试猜测其他参数.它看起来像在内部,它必须做这样的事情,因为它有时产生"预期类型A[B, ?]
但得到A[C, D]
" 形式的错误消息,这意味着在两个类型参数中A
,它可以找到第一个B
但是有没有关于第二个的信息.
使用案例: Tomasz的问题,这段代码:
def firstAndLast[CC, A, That](seq: CC)(implicit asSeq: CC => Seq[A], cbf: CanBuildFrom[CC, A, That]): That = {
val b = cbf(seq)
b += seq.head
b += seq.last
b.result
}
Run Code Online (Sandbox Code Playgroud)
无法调用List("abc", "def") map firstAndLast
,但这可行:
List("abc", "def") map firstAndLast[String, Char, String]
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我的问题归结为:有没有办法告诉类型inferencer CC
参数应该是什么String
,并要求它找出自己的A
和That
?实质上,就像
List("abc", "def") map firstAndLast[CC = String]
Run Code Online (Sandbox Code Playgroud)
要么
List("abc", "def") map firstAndLast[String, <guess>, <guess>] …
Run Code Online (Sandbox Code Playgroud) 我想做这样的事情:
def iDontLikeStrings(arg: Not[String]) = {....}
Run Code Online (Sandbox Code Playgroud)
基本上,这应该编译:
iDontLikeStrings(23)
iDontLikeStrings(true)
Run Code Online (Sandbox Code Playgroud)
这不应该编译:
iDontLikeStrings("hello")
Run Code Online (Sandbox Code Playgroud) 我还在学习Scala - 所以请原谅我,如果这非常简单.我对Scalaz或Shapeless也不是很流利 - 我只是开始探索这些库.我正在寻找一个简单的论文,向我解释我如何能做到这样的事情
trait AmazingMalini[F[G[_]]] {
def fMap[A,B](aa: F[G[A]])(f : A => F[G[B]]) : F[G[B]]
}
Run Code Online (Sandbox Code Playgroud)
然后我想能够做这样的事情 -
trait SomeCrazyMagicWithList extends AmazingMalini[Option[List]]{
def fMap[A,B](aa: Option[List[A]])(f : A => Option[List[B]]) :Option[List[B]] = ???
}
Run Code Online (Sandbox Code Playgroud)
请注意,选项或列表类型只是示例我有一些容器类型,我会在那里替换它们(为应用程序构建一个小的图形遍历,如DSL).
Scala数组有一个slice()方法来返回连续的子集.那很有用!
scala> val arr = Array(1,2,3,4,5,6,7,8)
arr: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8)
scala> arr.slice(2,6)
res1: Array[Int] = Array(3, 4, 5, 6)
Run Code Online (Sandbox Code Playgroud)
现在如何更新连续的子集?我们有什么简洁的选择 - 也许比我们使用System.arrarycopy的后备更好?
scala> val carr = Array(111,222,333,444,555,666,777,888)
carr: Array[Int] = Array(111, 222, 333, 444, 555, 666, 777, 888)
scala> System.arraycopy(carr,3,arr,3,5)
scala> arr
res6: Array[Int] = Array(1, 2, 3, 444, 555, 666, 777, 888)
Run Code Online (Sandbox Code Playgroud) 当我遇到这个问题时,我试图用更高种类和类型的边界来玩.我的用例是我希望能够使用Request的任何子类型或Request类型本身来参数化GenericAction实例.Action trait使用默认类型Request扩展GenericAction特征(在这种情况下,只会生成Request的匿名实例).
trait Request[+A]
trait GenericAction[A, R[_] <: Request[_]]
trait Action[A] extends GenericAction[A, Request]
trait ActionBuilderBase[R[_] <: Request[_], G[_] <: GenericAction[_,R]]
Run Code Online (Sandbox Code Playgroud)
ActionBuilderBase具有与子特征ActionBuilder和ActionBuilder2共享的实用程序方法.ActionBuilder生成默认的Action [A]和Request [A]实例.
trait ActionBuilder extends ActionBuilderBase[Request,Action]
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都那么好,但是当我尝试创建另一个使用R和GenericAction子类扩展ActionBuilderBase的特性时(在这种情况下会创建GenericAction的匿名实例),它无法编译.我想原因是在第一个ActionBuilder的情况下,请求类型已经被"填充"(因为Action [A]已经有一个请求类型== Request),这与下面的示例不同.为了让这个例子有效,我需要"填写"什么?
//Fails with "GenericAction takes two type parameters, expected: one" - what should the type annotation for GenericAction look like?
trait ActionBuilder2[R[_] <: Request[_]] extends ActionBuilderBase[R,GenericAction]
Run Code Online (Sandbox Code Playgroud) 在其中一个Stack Overflow答案中,引用了:
Scala是一种完全面向对象的语言,比Java更为强大,它是非研究语言中最先进的类型系统之一.
Scala的类型系统在哪些方面比Java更先进?