【问题标题】:Interoperability with Java in Frege, especially in IO Monad在 Frege 中与 Java 的互操作性,尤其是在 IO Monad 中
【发布时间】:2016-02-23 15:18:57
【问题描述】:

我想把这个 java 代码翻译成 Frege Haskell:

    PApplet pApplet = new PApplet();
    System.out.print(pApplet.toString());
    PApplet.runSketch(new String[]{"test"}, pApplet);

到目前为止我做到了:

data PApplet = mutable native processing.core.PApplet
  where
    native new :: () -> IO PApplet
    native toString :: PApplet -> IO String

native runSketch processing.core.PApplet.runSketch
  :: ArrayOf RealWorld String -> PApplet -> IO ()

main _ = do p <- PApplet.new
            pStr <- p.toString
            putStrLn pStr
            args = JArray.fromList ["test"]
            runSketch args p

直到main 的部分都可以编译,但是我得到了这些错误:

E Process.fr:14: type error in expression fromList ("test":[])
    type is : STMutable t1 (JArray String)
    expected: ArrayOf RealWorld String
E Process.fr:15: type error in expression p
    type is : IO PApplet
    expected: PApplet
E Process.fr:12: type error in expression >>= p.toString (λpStr -> >> (putStrLn pStr) (runSketch (fromList ("test":[])) p))
    type is : IO ()
    expected: ()→t1
E Process.fr:11: type error in expression λp -> >>= p.toString (λpStr -> >> (putStrLn pStr) (runSketch (fromList ("test":[])) p))
    type is : IO ()
    expected: ()→t1
E Process.fr:11: type error in expression >>= new (λp -> >>= p.toString (λpStr -> >> (putStrLn pStr) (runSketch (fromList ("test":[])) p)))
    type is : ()→t1
    expected: IO ()
E Process.fr:11: type error in expression λ_ -> >>= new (λp -> >>= p.toString (λpStr -> >> (putStrLn pStr) (runSketch (fromList ("test":[])) p)))
    type is : ()→t1
    expected: IO ()
E Process.fr:12: can't find a type for  p.toString `toString`
    is neither an overloaded function nor a member of  IO PApplet

我正在努力满足编译器标准,但没有成功。在无数次随机组合之后,上面的这个 sn-p 对我来说似乎是最合理的。我需要在do 块中输入提示吗?我不明白为什么p &lt;- PApplet.new 评估为IO PApplet?以及如何使 JArray.fromList 返回 ArrayOf RealWorld String ? Frege 很棒,但互操作性非常令人生畏。是否有可能在 Frege github 上有更多关注它的示例?

【问题讨论】:

  • 我不熟悉 frege,所以我假设它与 Haskell 足够相似。您声明 PApplet.new 的类型为 () -&gt; IO PApplet,但您使用它时不带参数:p &lt;- PApplet.new 应该是 p &lt;- PApplet.new ()(并且 pStr &lt;- p.toString 应该是 pStr &lt;- p.toString p)。但是,p &lt;- PApplet.new不是类型错误,因为(-&gt;) () 是一个单子!编译器认为你在​​这个 monad 中工作,而不是 IO。我认为第一个错误(关于fromList ("test":[]))是不相关的,但抱怨()→t1 的错误是由于这个遗漏。
  • 是的,在没有() 的情况下调用PApplet.new 是大多数编译器抱怨的原因!我真的很傻。
  • 现在的问题只是关于如何摆脱Process.fr:14: type error in expression fromList ("test":[]) type is : STMutable t1 (JArray String) expected: ArrayOf RealWorld String

标签: java haskell frege


【解决方案1】:

你有

ST s X

你想要

X

而你在IO,不过是ST RealWorld

因此,最自然的解决方案是将= 替换为&lt;-

args = JArray.fromList ["test"]

你准备好了!

当然,由于类型别名,整个故事有点困难:

type ArrayOf a x = Mutable a (JArray x)
type STMutable s a = ST s (Mutable s a)

是否选择了去锯齿进行翻译

ST s (Mutable s (JArray String))

返回

ST s (ArrayOf s String)

你可能已经看过了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    相关资源
    最近更新 更多