Java 是否可以将frege与Play框架一起使用

Java 是否可以将frege与Play框架一起使用,java,scala,playframework,jvm,frege,Java,Scala,Playframework,Jvm,Frege,我正在为一个新项目寻找一种语言。这是一个基于web的项目,我想采用REST体系结构 我还想要一种函数编程语言。我可以选择Haskell(因为它很酷)和Scala(因为Play框架) 在进行了一些研究以找出这两种语言之间的主要差异之后,我发现了Frege,一种在JVM上运行的类似Haskell的语言 所以我的问题是,因为Frege是在JVM上运行的,所以有可能将Play框架与Frege一起使用吗 下面是一个简单的应用程序,演示如何将Frege与Play结合使用。因为Play支持Java,所以实际上

我正在为一个新项目寻找一种语言。这是一个基于web的项目,我想采用REST体系结构

我还想要一种函数编程语言。我可以选择Haskell(因为它很酷)和Scala(因为Play框架)

在进行了一些研究以找出这两种语言之间的主要差异之后,我发现了Frege,一种在JVM上运行的类似Haskell的语言


所以我的问题是,因为Frege是在JVM上运行的,所以有可能将Play框架与Frege一起使用吗

下面是一个简单的应用程序,演示如何将Frege与Play结合使用。因为Play支持Java,所以实际上很容易使用Frege的javaapi,尽管我们还没有对Frege的本地Play支持。应用程序基本上是JSON in和JSON out。Frege程序从JSON
POST
请求中读取一个参数,并用一个JSON响应向用户打招呼

播放
conf/routes

POST     /greet                      helloplay.FregeApplication.greet()
现在,弗雷格实际的“业务逻辑”是:

module helloplay.FregeApplication where

import Data.JSON
import helloplay.Play

data GreetingRequest = GreetingRequest { name :: String }

data GreetingResponse = GreetingResponse { message :: String }

instance FromJSON GreetingRequest where
   fromJSON (Struct fs)  = do
        name <- field "name" fs
        pure $ GreetingRequest name
   fromJSON invalid = fail ("Invalid JSON for Greeting Request: " ++ show invalid)

instance ToJSON GreetingResponse where
    toJSON (GreetingResponse message) = Struct [ assoc "message" message ]

greet :: GreetingRequest -> GreetingResponse
greet request = GreetingResponse $ "Hello, " ++ request.name

webMain :: Request -> IO ResultStatus
webMain request = do
  let jsonRequest = parseJSON request.body.asJson.toString
  return $ either badRequest (ok . show . toJSON . greet) jsonRequest

{-
 - This makes the Frege module extend Play Controller class so that it can be configured to handle a route.
 -}
native module type PlayController where {
    public static play.mvc.Result greet() {
        return frege.runtime.Delayed.forced(
          frege.prelude.PreludeBase.TST.performUnsafe(webMain(request()))
        );
    }
}
就是这样!我们可以通过以下方式运行它:

activator运行

然后

$ curl --header "Content-type: application/json" --request POST --data '{"name": "PlayFrege"}' http://localhost:9000/greet

{"message" : "Hello, PlayFrege"}

Frege有一个可用于在Play项目中编译Frege源代码的。如果有人想试用,我已经推出了这个示例应用程序。

请注意,frege有自己的标签。我相应地更改了标签,因为可能在Haskell线程中闲逛的人对此不能说太多。甚至我都无法回答,因为我不知道wtf的比赛是什么。这肯定是可能的。如果Java有可能,那么将其移植到Frege就不会那么难了。我有一次真的搬到了弗雷格。我将尝试与Frege一起玩,稍后再发布一个示例,因为我现在不是我的计算机。@Marimuthu从我对这种语言的了解来看,每个外部对象和函数都必须声明为somun,其中代码作为对现有JVM实现的本机调用(这似乎是合乎逻辑的)。所以我想我必须添加我想要使用的evry Play API对象的定义。我说的对吗?@EmrysMyrooin是真的。您可以增量地完成,只需定义您真正需要的类型(并且在类型中只定义您真正需要的方法)。或者,您可以使用本机gen工具一次完成所有操作。然而,lataer通常需要一些检查和手动维护。这是工作项目还是业余项目?如果是为了工作,我建议只使用scala。否则,为什么不看看锈迹呢?做得很好,一如既往,马里穆图!不过,我有一个问题:为什么我们不能只说
request.body.asText
而不是
toJson.toString
?好吧,这似乎可行,但我认为这很简单。。。我想把它用于一个工作和严肃的项目,我在这里介绍了一些自动化功能,比如JSON解析和数据库管理。但我对一些个人项目不太在意,等待从play port到fregeThanks Ingo!我先尝试了一下,但对于JSON请求似乎不起作用。@Emrys很公平。是的,有了本机播放支持,您将获得所有这些自动化,但我不认为这里有任何黑客行为。当然,我可以理解,您不想在工作项目中这样做,但作为JVM语言,您可以将Frege与Java和Scala代码混合,并从纯FP中获得一些好处。如果你真的尝试一下,我很高兴得到你的反馈。是的,我想我会尝试用Play和Scala做所有的web管理工作,并且只将功能部分委托给Frege模块。我认为这可能是一个相当酷的游戏
$ curl --header "Content-type: application/json" --request POST --data '{"name": "PlayFrege"}' http://localhost:9000/greet

{"message" : "Hello, PlayFrege"}