我正在尝试使用IdrisNet2库来定义一些二进制数据结构。我正在使用Idris 0.9.17.1并提交IdrisNet2的262b746c9a2405e43d1de6a48de44cac2fd19932。我正在定义一个包含16位字段的数据包:
module Main
import IdrisNet.PacketLang
import Data.So
myPacket : PacketLang
myPacket = with PacketLang do
bits 16
main : IO ()
main = putStrLn "hello"
我收到编译错误:
Can't solve goal
So (fromInteger 16 > fromInteger 0)
究竟是什么问题,我该如何解决?我猜我需要向编译器证明16大于0,但我不确定如何在Idris中执行此操作或为什么这是必要的。
答案 0 :(得分:3)
很抱歉。前段时间我们决定对所有类型及其构造函数的大写标准化;这意味着oh
和so
已重命名为Oh
和So
。所以有一个更新到这个lib来让它进行编译,但它看起来像oh
在默认策略中解决隐式参数被忽略了:
https://github.com/SimonJF/IdrisNet2/blob/master/src/IdrisNet/PacketLang.idr#L149
所以这种策略总是会失败(oh
是一个未定义的引用)。您可以在那里明确传递p
的值,这样就可以了:bits 16 {p = Oh}
。
但是我已经提交了一个拉取请求来修复lib中的问题:https://github.com/SimonJF/IdrisNet2/pull/11