【问题标题】:how to use multiple inline assertions in Frege如何在 Frege 中使用多个内联断言
【发布时间】:2013-09-14 01:47:33
【问题描述】:

为了自检示例,我运行了以下代码:

assert :: Bool -> Bool -> String -> IO ()
assert actual expected description
    | expected == actual     = do { print "" }   -- need a better way to do nothing
    | otherwise              = error description

main _ = do
    assert (odd 2) false "2 is not odd"
    assert (odd 3) true  "3 is odd"

我知道这并不完美(建议非常受欢迎),但当前的问题是,当我将断言的定义放入模块 util.Assertions 时,使用两个断言无法编译

build/realworld/chapter2/FunctionApplication.java:168: error: cannot access ?
              Assertions.?._assert?.apply(
                        ^
class file for util.Assertions$? not found
1 error
E .../Real_World_Frege/chapter2/FunctionApplication.fr:24: java compiler errors are most likely caused by erronous
native definitions

当我只有一个断言时它起作用,因此类本身在 CP 上,并且模块导入原则上起作用。怎么了?

【问题讨论】:

    标签: frege


    【解决方案1】:

    您的assert 函数会生成m () 形式的类型,其中mMonad。因此,“什么都不做”的最好方法就是只做

    return ()
    

    对于你问题的第二部分,我真的无法想象出了什么问题。请安排您的 github 存储库,以便我可以下载并自己尝试。另外,给出你使用的编译命令和工作目录。

    (顺便说一句,您应该使用可以显示 Unicode 的终端模拟器。 Windows下,试试chcp 65001)

    【讨论】:

    • 我以为我拥有它,但它需要更多的工作。最新状态在 repo 中。
    • 我用这个 gradle build 编译似乎 -sp 标志不起作用,一个 a) 必须将 all 文件分别提供给命令行,b) 有手动关心正确的编译顺序。这是故意的吗?
    • -sp 标志仅在给出 -make 标志时使用。在所有其他情况下,编译器仅使用类文件(在类路径上)或命令行上的文件(按给定顺序)。因此,在大多数情况下,这样说就足够了:java -jar fregec.jar -d bin -make path/to/your/main/module/here.fr
    • 我下载了您的源代码,在 FunctionApplication.fr 中注释了 assert 函数,并取消了 util.Assertions 导入的注释。然后下面的命令编译的东西没有问题: java -jar ~/frege/fregec.jar -v -d bin -make -sp Real_World_Frege-master/ Real_World_Frege-master/chapter2/FunctionApplication.fr
    • 深夜提问,下周日中午有答案,真是太酷了!感谢那。非常感激。以上工作。不过,它触发了下一个关于如何编译整个源代码树的问题,但我会单独问。
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多