scala - 接受两个monadic值并返回一个monadic值的泛型函数

标签 scala haskell generics monads

我编写了以下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/

相关文章:

xml - 如何使用 scala 中的 spark xml 解析器解析 XML 中的字符串?

scala - 如何在不使用案例类但使用 StructType 的情况下创建数据集(不是 DataFrame)?

list - 使用列表递归 - Haskell

java - 变长泛型类型

java - Scala 时区问题

scala - 声明和初始化实例/类变量的首选方式

haskell - 如何在 Haskell 中编写递归 lambda 表达式?

haskell - 如果多个 monad 为 "mixed",是否可以利用 Monadic 结构?

java泛型转换问题

c# - C# 中的哪些泛型集合是 IXmlSerializable?