2

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

这是我的测试示例。基本上,我想翻译以下 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
4

2 回答 2

1

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

pure native jBigDecimalS new :: String -> JBigDecimal RealWorld
于 2013-02-21T23:06:17.433 回答
1

顺便说一句,你不需要RealWorld无处不在。你有一个纯原生数据类型,你只应用纯原生函数。

此外,事实证明,当我们有时支持 Java 泛型时,您在此处使用的幻像类型约定不会很好地发挥作用。然后我们会有类似的东西

data List a = native java.util.LinkedList

我们希望将awith kind*映射到泛型类型参数。但是,这不会与指示幻像类型的状态线程很好地混合。

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

abstract data Mutable s a = Mutable a

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

但同样,当您使用不可变数据时,就BigDecimal足够了(这不会改变)。

于 2013-02-22T00:33:40.127 回答