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
,它就在那里。
我正在尝试通过我的玩具项目学习 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
,它就在那里。