【问题标题】:Calling native Java constructors from Frege从 Frege 调用本机 Java 构造函数
【发布时间】:2013-02-22 08:33:40
【问题描述】:

您知道我在哪里可以找到有关 Frege 的 Java 绑定的文档吗?来自 Haskell,我发现 Frege 最有趣的方面。不幸找到的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

【问题讨论】:

    标签: java jvm native frege


    【解决方案1】:

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

    pure native jBigDecimalS new :: String -> JBigDecimal RealWorld
    

    【讨论】:

    • 就在今天,我上传了一个新的 Langspec,其中包含扩展的第 8 章。见 code.google.com/p/frege/downloads/list
    • @Ingo 非常感谢!就是这样,第 8.9.4 节“类实例创建表达式”。
    【解决方案2】:

    顺便说一句,您不需要在任何地方使用RealWorld。你有一个纯原生数据类型,你只应用纯原生函数。

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

    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 就足够了(这不会改变)。

    【讨论】:

    • putStr 和 putStrLn 最近已添加 -- 请参阅 github.com/Frege/frege/commit/…
    • 谢谢!你说得对,我从另一个例子改编的RealWorld这里不需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2011-03-24
    • 2018-02-28
    • 2015-07-02
    • 1970-01-01
    • 2014-02-04
    相关资源
    最近更新 更多