您知道我在哪里可以找到有关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
答案 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
就足够了(这不会改变)。