Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何组合两个函数0 val';s转换为一个函数0_Scala_Scalaz - Fatal编程技术网

Scala 如何组合两个函数0 val';s转换为一个函数0

Scala 如何组合两个函数0 val';s转换为一个函数0,scala,scalaz,Scala,Scalaz,我想象这样的情况: def combine[A, B, C](f: (A, B) => C): (M[A], M[B]) => M[C] 而M将是Function0。这在scalaz中可能吗?在标准scala中没有那么难,只需坚持您的签名: import scalaz._; import Scalaz._ def combine[A, B, C, M: Applicative](f: (A, B) => C) = (ma: M[A], mb: M[B]) =>

我想象这样的情况:

def combine[A, B, C](f: (A, B) => C): (M[A], M[B]) => M[C]

M
将是
Function0
。这在scalaz中可能吗?

在标准scala中没有那么难,只需坚持您的签名:

import scalaz._; import Scalaz._

def combine[A, B, C, M: Applicative](f: (A, B) => C) = 
   (ma: M[A], mb: M[B]) => (ma |@| mb)(f)
def combine[A,B,C]( f: (A,B) => C ) 
  = ( fA:(()=>A), fB:(()=>B) ) => f( fA(), fB() )
下面是一个小例子:

scala> val isProdPositive = combine( (i:Int,d:Double) => i*d > 0.0 )
  isProdPositive: (() => Int, () => Double) => Boolean = <function2>

scala> val f1 = () => 2
  f1: () => Int = <function0>

scala> val f2 = () => -1.5
  f2: () => Double = <function0>

scala> isProdPositive(f1,f2)
  res1: Boolean = false
scala>val isProdPositive=combine((i:Int,d:Double)=>i*d>0.0)
isProdPositive:(()=>Int,()=>Double)=>Boolean=
scala>val f1=()=>2
f1:()=>Int=
scala>val f2=()=>-1.5
f2:()=>Double=
scala>isProdPositive(f1、f2)
res1:Boolean=false

你能详细说明你的问题吗。正如它所写的,它没有意义。@mepcotterrel我不同意。他给出了类型签名,这应该足够了。实际上,只有一个具有此签名的函数的扩展等效实现。至于实现,有很多方法可以用scalaz实现它,因为这种模式在日常编程中非常常见。它通常被描述为“lift-2”。注意,您可以将签名重新排列为:(A=>B=>C=>(M[A]=>M[B]=>M[C])。这就好像您正在将函数(arity-2)“提升”到环境M中一样。由于scala不是纯语言,我希望传递到
combine
的函数能够执行副作用,就像读取变量一样。只要传递到的函数是纯函数,这个定义就可以正常工作,因为第一个函数只执行一次。这是scalaz的意图吗?