相关疑难解决方法(0)

是否可以在Scala中实现liftM2?

在Haskell中,liftM2可以定义为:

liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 f m1 m2 = do
  x1 <- m1
  x2 <- m2
  return $ f x1 x2
Run Code Online (Sandbox Code Playgroud)

我想把它翻译成Scala.我的第一次尝试如下:

def liftM2[T1, T2, R, M[_]](f: (T1, T2) => R)(ma: M[T1], mb: M[T2]) : M[R] = for {
  a <- ma
  b <- mb
} yield f(a, b)
Run Code Online (Sandbox Code Playgroud)

我认为这是最明显的可行方式:"flat flatMap不是类型参数M [T1]的成员".是的,我没有说明M[_]是某种单子.所以接下来我尝试的是定义一些结构类型,如:

type Monad[A] = {
  def flatMap[B](f: (A) => …
Run Code Online (Sandbox Code Playgroud)

monads haskell scala typeclass lifting

28
推荐指数
1
解决办法
1311
查看次数

如何在Scala中写出毕达哥拉斯定理?

直角三角形的斜边的平方等于另外两边的平方的总和.

这是毕达哥拉斯定理.基于其边的长度"a"和"b"来计算斜边的函数将返回sqrt(a*a + b*b).

问题是,你如何在Scala中定义这样一个函数,以便它可以用于实现适当方法的任何类型?

对于上下文,根据您正在做的事情以及速度,精度,准确度和范围要求,想象您想要使用Int,Double,Int-Rational,Double-Rational,BigInt或BigInt-Rational类型的整个数学定理库. .

scala

24
推荐指数
2
解决办法
3423
查看次数

Scala:是否可以指出实现某种方法的泛型类

我认为通过一个简单的例子来解释它更容易.(欢迎帮助改写标题;-)

我想实现一个squared方法,并使用implicit def,自动将其添加到任何支持*-operator的类.

使用Int非常容易:

class EnhancedInt(x: Int) { def squared = x * x }

implicit def IntToEnchancedInt(x: Int) = new EnhancedInt(x)
Run Code Online (Sandbox Code Playgroud)

但是对于Any或AnyVal,我收到以下错误:

scala> class EnhanceAny(x: AnyVal) { def squared = x * x }
<console>:7: error: value * is not a member of AnyVal
       class EnhanceAny(x: AnyVal) { def squared = x * x }
Run Code Online (Sandbox Code Playgroud)

我想知道如何将它应用于任何数字类,或者甚至更好地应用于任何支持*-operator的类.

generics scala implicit-conversion

10
推荐指数
1
解决办法
812
查看次数

scala中不再支持递归结构类型吗?

有些人声称如果使用scalac的-Yrecursion选项,scala能够处理递归结构类型.不过我的简约例子不会编译:

type Num = {
  def +(n: Num): Num
}
Run Code Online (Sandbox Code Playgroud)

编译产量:

$ scalac -version
Scala compiler version 2.8.0.final -- Copyright 2002-2010, LAMP/EPFL
$ scalac -Yrecursion 100 Num.scala 
Num.scala:3: error: recursive method + needs result type
def +(n: Num): Num
               ^
one error found
Run Code Online (Sandbox Code Playgroud)

这改变了吗?这个例子不应该编译吗?

scala

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

自我指责鸭子打字

我希望编写一个函数,该函数可以处理任何可以添加到其自身类型的其他成员的值(无论"添加"在上下文中是什么意思).这种类型的明显(嘿嘿)定义:

type Addable = { def +(a : Addable) : Addable }
Run Code Online (Sandbox Code Playgroud)

这给了我一个我根本不懂的错误:递归方法+需要结果类型

为什么不是最后: Addable的结果类型?为什么它认为+是递归的呢?

但我发现了一个更普遍的问题,试图在自己的定义中引用一个类型:

type T = { def f: T  }     
Run Code Online (Sandbox Code Playgroud)

但后来我有了一个脑波:用Java的方式解决它!

type T[T] = { def f: T  } 
Run Code Online (Sandbox Code Playgroud)

这个汇编了!

但现在我还有两个问题.

首先,我不知道如何使用T型.特别是,

def n(a:T) = a.f
Run Code Online (Sandbox Code Playgroud)

给出完全明智但令人沮丧的"类型T取类型参数"错误.

其次,尝试将此模式应用于原始问题

type Addable[Addable] = { def +(a : Addable) : Addable }
Run Code Online (Sandbox Code Playgroud)

导致一个完全不可理解的"结构细化中的参数类型可能不会引用在该细化之外定义的抽象类型".(实际的问题并不在于它是"+" - 感谢上帝和马丁,因为那会让我的脑袋变得一团糟 - 只需要一个Addable作为参数.)

所以

  1. 如何定义鸭子类型含义"有一个特定的函数返回相同类型的值"?
  2. 如何定义鸭子类型含义"有一个特定的函数采用与参数相同的表达式"?

我有一种宗教般的信念,认为这个问题是可以解决的.

scala

4
推荐指数
1
解决办法
882
查看次数