Scalaz 和主要方法

Scalaz and main method

我正在尝试通过我的玩具项目学习 Scalaz,我在 Haskell 中使用了 monad,现在我想学习如何在 Scalaz 中使用它们和 Scalaz。

最大的问题是,如何在 Scala 的 main 方法中使用 IO() Monad?

在Haskell中,main函数是[​​=10=]类型,在Scala中是().

类型

目前我找到的解决方案是创建另一个 IO() 类型的函数 foo 并在主方法调用 foo.unsafePerformIO() 中。但这让我感到畏缩。

有什么解决方案?

Scala 的原生 main 方法是有副作用的;在其中调用 unsafePerformIO 是完全安全的。

事实上,考虑到大多数 Scala 项目都不是 100% pure/Scalaz 代码,这种方法可能是最惯用的方法。有人可能已经为它提供了一个 "elegance" 包装器,但它除了美观之外不会增加任何价值。而且,再一次,大多数时候你会在一个更主流的、非纯粹的、甚至可能是非功能性的 Scala 代码中嵌入一个 Scalaz IO 操作。

此外,一般来说,甚至在 Haskell 中,unsafe 函数通常只是 makeSureYouKnowWhatYoureDoing 函数。

Scalaz 提供了一个 SafeApp trait,它允许您用看起来更像 Haskell 的 main 的包装器替换 Scala 的副作用 main 方法:

import scalaz._, Scalaz._, effect.{ IO, SafeApp }

object MyMain extends SafeApp {
  override def runl(args: List[String]): IO[Unit] = IO(println("hello world"))
}

现在 MyMain 可以像任何其他 JVM class 一样使用静态 main

我个人使用 SafeApp 的次数不多,但如果您想避免手动调用 unsafePerformIO,它就在那里。