从Frege调用本机Java构造函数

时间:2013-02-21 22:56:51

标签: java jvm native frege

您知道我在哪里可以找到有关Frege Java绑定的文档吗?来自Haskell,我发现弗雷格最有趣的方面。不幸的是,我发现的documentation并没有详细说明。

这是我的测试示例。基本上,我想翻译以下Java代码:

BigDecimal x = BigDecimal.valueOf(7);
BogDecimal y = new BigDecimal("5.13");
System.out.println(x.add(y));

这是我目前的弗雷格代码:

module Main where

data JBigDecimal s = pure native java.math.BigDecimal
  where
  pure native jAdd add :: JBigDecimal RealWorld -> JBigDecimal RealWorld -> JBigDecimal RealWorld
  pure native jShow toString :: JBigDecimal RealWorld -> String

pure native jBigDecimalI java.math.BigDecimal.valueOf :: Int -> JBigDecimal RealWorld

-- ERROR: Here, I don't know what I should write.
-- I want to bind to the BigDecimal(String) constructor.
-- I tried several versions but none of them was successful, e.g.:
pure native jBigDecimalS java.math.BigDecimal.BigDecimal :: String -> JBigDecimal RealWorld

main :: [String] -> IO ()
main args = let x = jBigDecimalI 7
                y = jBigDecimalS "5.13"
                z = JBigDecimal.jAdd x y
            in printStrLn $ (JBigDecimal.jShow z)
-- (BTW, why `printStrLn` and not `putStrLn` as it is called in Haskell?)

为了完整起见,错误信息是:

calling: javac -cp fregec-3.21.jar:. -d . -encoding UTF-8 ./Main.java 
./Main.java:258: error: cannot find symbol
        return java.math.BigDecimal.BigDecimal(
                               ^
  symbol:   method BigDecimal(String)
  location: class BigDecimal
1 error
E frege-repl/example.fr:15: java compiler errors are most likely caused by
    erronous native definitions

2 个答案:

答案 0 :(得分:1)

我找到了。构造函数名为new:

pure native jBigDecimalS new :: String -> JBigDecimal RealWorld

答案 1 :(得分:1)

顺便说一下,你到处都不需要RealWorld。您具有纯本机数据类型,并且仅应用纯本机函数。

此外,事实证明,当我们有时支持Java Generics时,你在这里使用的幻像类型约定不会很好。然后我们会有像

这样的东西
data List a = native java.util.LinkedList

我们希望a*种类映射到泛型类型参数。但是,这并不能很好地混合表明幻像类型的状态线程。

因此(即将推出!)我们将有一个标记可变值的类型,就像

abstract data Mutable s a = Mutable a

所以永远不能真正构建/解构Mutable。这应该工作,以便只有本机函数可以创建类型Mutable s a的值(在IO或ST monad中),然后可以使用freeze创建一个安全的副本,其中一个人认为是不可变的a回来了。但是这个不能传递给需要Mutable s a的不纯函数。

但是,再次,当您使用不可变数据时,只需BigDecimal就足够了(这不会改变)。