- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个愚蠢的 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/
出于好奇,我在 Frege 中尝试了以下代码: println (mydrop 30000000 [1..30000001]) 不用说,3000 万个条目的序列有点愚蠢,我对 OOME 没问题。我想看
一些语言允许模块跨越多个文件。在 Frege 中,这意味着模块的命名空间将对以后的扩展“开放”。 我认为这是不可能的,因为模块是由它们编译的类文件定位的——除非会有一些聪明的命名技巧。 我只是想确定一
按照 how to use multiple inline assertions in Frege 的回答我学会了如何编译两个 Frege 模块 A 和 B,其中 B 依赖于 A:你必须编译 B。如果
在交互式 shell 和(在线)REPL 中我可以输入 :type 1 找出表达式“1”的类型。我可以从代码中使用任何函数来达到相同的效果吗? 最佳答案 目前没有简单的方法可以做到这一点。 但是,RE
在尝试学习弗雷格时,我从 Dierk's Real World Frege 复制了一些代码到在线 REPL 并尝试执行它(另请参见 How to execute a compiled code sni
在尝试处理异常时我发现了一个相关的问题: what is the Frege equivalent to Haskell's "interact" function? 但我不清楚如何使用 try/ca
我正在尝试找出 native 界面。我正在尝试使用 UDP 发送一些消息。这是我所拥有的: module UDPTest where data StringAsBytes = native ja
如果 Frege 有一个 POM 并被上传到 maven central 或 bintray,我可以很容易地将它用作 maven、gradle、buildr 和 via grapes 中的 maven
我尝试从在 Frege 中运行的真实 Haskell 中获取字数示例: main _ = interact wordCount where wordCount input = show (le
该程序在GHC下编译运行正常: type Church a = (a -> a) -> a -> a ch :: Int -> Church a ch 0 _ = id ch n f = f . ch
我想构建一个抽象来使用不同的模板引擎: class Template a where process :: a -> Model -> IO String class TemplateEngine
您将如何调整这个简单的递归示例,以便进行尾调用优化(而不是 StackOverflowError)? count 0 = 0 count n = succ (count (pred n)) count
尾调用是否在 Frege 中进行了优化。我知道 Java 和编译为 JVM 字节码的语言(如 Clojure 和 Scala)都没有 TCO。弗雷格呢? 最佳答案 Frege 通过简单地生成 whil
我是在阅读 Frege language specification 后发布的并使用搜索引擎寻找示例。我希望我没有忽略一个明显的答案。 我正在尝试将一些 Haskell 代码移植到 Frege,但我找
我正在努力将 GHC/Arr.hs 移植到弗雷格。 数组定义: data Array i e = Array{u,l::i,n::Int,elems::(JArray e)} 有函数: amap ::
根据 Hoogle,>= (bar <=< baz) 无积分,它给了我 bar <=< baz =<< foo 考虑到固定性,这看起来不太正确。 最佳答案 Frege 就像 Haskell,但 Fre
假设我有一个所有素数的列表,定义为 primes :: (Enum α, Integral α) => [α] primes = sieve [2..] where sieve :: (Integ
我正在尝试加载文件。 我有: wf :: STMutable a File wf = File.new "worlds/seed_77.world" data PickleSerialization
我认为我在这里犯了一个简单的错误,但我无法让 Frege 找到本地 Eclipse 项目之外的任何类。 我有一个正在运行的重要 Java 项目(不是我的),我不想修改它。我想要一个新的、干净的弗雷格启
假设我想映射 Java 代码: package mypackage; class A { public String[] values() { return new String
我是一名优秀的程序员,十分优秀!