我编写了以下Haskell函数,该函数接受两个monadic值并将它们组合为一个monadic值(这只是为了说明Haskell类型系统可以支持的通用性(或通用性)程度)。
combine x y = do
a <- x
b <- y
return (a, b)
我用三种不同的monad进行了测试:
main = do
putStrLn $ show $ combine (Just 10) (Just 20) -- Maybe a
putStrLn $ show $ combine [100] [10, 20] -- [] a
a <- combine getLine getLine -- IO a
putStrLn $ show a
并按预期方式works great。现在,我想知道Scala的类型系统是否可以让我编写上面的函数而不会影响通用性。但是我对Scala的了解还不够(尽管我希望对其进行探索)。那么有人可以帮助我将此代码转换为Scala吗?
最佳答案
我认为这是等效的:
import cats._
import cats.implicits._
def combine[T, F[_]: Monad](fa: F[T], fb: F[T]) = for {
a <- fa
b <- fb
} yield (a, b)
Monad
来自库(cats或scalaz)。combine(Option(10), Option(20))
产生Some((10,20))
,而combine(List(100), List(10, 20))
产生List((100,10), (100,20))
。编辑:上面的版本是过度约束,因为它需要两个参数类型是相同的。
def combine[A, B, F[_]: Monad](fa: F[A], fb: F[B])
修复了该问题。
关于scala - 接受两个monadic值并返回一个monadic值的泛型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49821460/