gpt4 book ai didi

java - 将值从 Frege 传递到 Java 并返回

转载 作者:行者123 更新时间:2023-11-30 02:55:39 25 4
gpt4 key购买 nike

假设我有一个愚蠢的 Frege 函数,它构造了一对 Num s。

newPair :: (Num α, Num β) => α -> β -> (α, β)
newPair = (,)
-- alternatively -- newPair x y = (x, y)

尝试从 Java 调用此函数,但是,PreludeBase.CNum<α>和一个 PreludeBase.CNum<β>除了预期之外还要求 Lazy<α>Lazy<β>Show 也是如此类型,其中

showSomething :: (Show α) => α -> String
showSomething = show
-- alternatively -- showSomething x = show x

需要 PreludeBase.CShow<α>除了预期参数之外。

将受约束的 Frege 对象传入和传出 Java 的正确方法是什么?

最佳答案

好问题,因为 wiki 中尚未对此进行解释。

在所有类似的情况下,我建议使用

:java

REPL 中的命令。例如:

frege> newPair 1 2.3
frege> :java

然后您将看到一个窗口,其中包含与此调用相对应的所有 Activity 定义。简单的文本搜索可以帮助找到调用 newPair 的位置。大多数时候这应该有助于解决此类问题。

在您的情况下,相关部分如下所示:

Console.<Integer, Double>numPair(
PreludeBase.INum_Int.it,
PreludeBase.IReal_Double.it,
Thunk.<Integer>lazy(1),
Thunk.<Double>lazy(2.3))

这里简要概述了类型类和实例的命名方式以及如何获取它们。

module x.y.Z where
class Xable where ...

这会产生具有完全限定名称的 Java 接口(interface)

x.y.Z.CXable

还有这个:

module a.b.C where
import x.y.Z
data MyType ... = ....
instance Xable MyType where ...

某堂课的成绩

a.b.C.IXable_MyType  /* implements CXable<TMyType> */

如果您的实例定义本身没有约束,则您可以使用一个单例实例。

a.b.C.IXable_MyType.it

否则,您需要通过将所有约束作为参数传递给构造函数来构造一个新实例。例如,

的 Show 实例
Maybe Int

看起来像这样:

new IShow_Maybe(IShow_Int.it)

因为实例头列出了 Maybe 元素类型的约束:

instance Show a => Show (Maybe a)

请注意,您需要完全了解实际类型,不能创建泛型类型类实例。这对于弗雷格本身来说从来都不是问题,因为所有需要的实例都从调用者传递给多态函数。然而,就目前情况而言,我们对 native 函数没有限制。

如果您需要这样的东西,在大多数情况下,只需传递您想要调用的函数作为参数即可实现该功能。

例如,这不起作用:

pure native myMethod :: Show a => a -> ...

但这应该:

pure native myMethod :: (a -> String) -> a -> ....
myMethod show (Just 47)
<小时/>

上面的示例 java 代码也表明它并不总是像描述的​​那么简单。例如,Double 类型没有单独的 Num 实例,而只有一个 Real 实例,它是数字。不幸的是,只有编译器知道某些类型实际存在哪些实例,以及哪些实例是隐式的,即由子类的实例提供。再说一次,REPL 是找到这个问题的最佳方法。

关于java - 将值从 Frege 传递到 Java 并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37280700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com