毫无疑问,以下代码抛出了运行时异常:
data Necklace = InvalidNecklace |
Necklace { necklace_id :: Int, meow :: Int, ... }
necklace_id InvalidNecklace
Run Code Online (Sandbox Code Playgroud)
是否有一些自然的方法来定义necklace_id应用于InvalidNecklace获取值而不是抛出异常的值?
如果我尝试显而易见的事情,GHC会因为`necklace_id'的多次声明错误而失败:
necklace_id InvalidNecklace = -1
Run Code Online (Sandbox Code Playgroud)
是否有一些pragma会告诉GHC用这个声明取代它的推断声明?
我可以InvalidNecklace通过添加声明是一个记录{ necklace_id :: Int },但afaik我不能保证它总是返回-1,并且通常会造成可怕的混乱.我可以简单地定义:
get_necklace_id InvalidNecklace = -1
get_necklace_id x = necklace_id x
Run Code Online (Sandbox Code Playgroud)
但这部分地破坏了记录的目的.
我想invalidNecklace通过写一个人可以创造一个特殊的价值:
invalidNecklace = Necklace { necklace_id = -1,
meow = error "meow invalidNecklace accessed", ... }
Run Code Online (Sandbox Code Playgroud)
第二种方法有什么缺点吗?我当然失去了meow严格或解包的能力,但也许可以保持单独的调试和优化版本.是否有一个pragma来本地禁用部分初始化记录的警告?
我可以创建和参考相对指针为结构用C++成员使用::*,.*和->*语法,如:
char* fstab_t::*field = &fstab_t::fs_vfstype;
my_fstab.*field = ...
Run Code Online (Sandbox Code Playgroud)
在Haskell中,我可以轻松地为记录getter创建临时标签,例如:
(idxF_s,idxL_s) = swap_by_sign sgn (idxF,idxL) ;
Run Code Online (Sandbox Code Playgroud)
Afaik,然后我不能使用这些getter更新记录,如:
a { idxF_s = idxL_s b }
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法可以在不编码每个记录设置器的情况下执行此操作
我知道对于以下记录的部分更新:
data A a b = A { a :: a, b :: b }
x = A { a=1,b=2 :: Int }
y = x { b = toRational (a x) + 4.5 }
Run Code Online (Sandbox Code Playgroud)
是否有任何技巧只能进行部分初始化,创建子记录类型或在子记录上进行(反)序列化?
特别是,我发现这些行中的第一行有效,但第二行没有:
read "A {a=1,b=()}" :: A Int ()
read "A {a=1}" :: A Int ()
Run Code Online (Sandbox Code Playgroud)
你总是可以使用正则表达式按摩这样的输入,但我很好奇Haskell类似的选项存在.
我有一个Data.Vector的Dog记录,每个标识House中说狗的生活.我需要一个查找例程来查找住在房子里的所有狗,模糊地如下,但我需要不断的时间查找,这是第一个版本无法提供的.
dogs_by_houses dogs h = [ d | d <- Vec.toList dogs, h == house d ]
Run Code Online (Sandbox Code Playgroud)
据我所知,优化Haskell代码的一个中心规则是编译器只在封闭lambda表达式内部计算每个表达式.因此,我必须在绑定之前dogs为dogs_by_houses dogs表达式内部的特定内容构建一个查找表h,是吗?
我认为这Data.Vector是完成此任务的最佳工具,尽管显然你不能像C++向量那样缩小它们.我大致如下实现:
dogs_by_houses :: Vec.Vector Dog -> Int -> [Dog]
dogs_by_houses dogs = let {
dog_house = house_id . house ;
v0 = Vec.replicate (maximum . map dog_house $ Vec.toList dogs) [] ;
f v d = let { h = dog_house d } in v // [(h,d:v!h)] …Run Code Online (Sandbox Code Playgroud) 应该如何使用 Cap'n Proto 来实现应用程序的可变状态,类似于使用 Protobuf 的方式?有垃圾收集器吗?
Kenton Varda 在对 Cap'n Proto、FlatBuffers 和 SBE 的比较中证实,Cap'n Proto 在消息内部使用 arena 分配器。如果长时间编辑单个消息,例如由于写入磁盘并重新加载,则该消息将无限增长。
Cap'n Proto 是否有垃圾收集器来重新排列消息并回收任何浪费的空间?垃圾收集器是最佳方法吗?如果没有,或者不存在,那么推荐的方法是什么?
我实际上正在编写一个 Rust 程序,无论如何它都只能保存加密数据。因此,我可以重新复制整个消息结构,但我对更广泛的选项感到好奇。
[
tests]模块允许我们将所有测试组合在一起,并在需要时定义辅助函数,这些函数不会成为我们其余箱子的一部分.cfg如果我们当前正在尝试运行测试,该属性仅编译我们的测试代码.这可以节省编译时间,还可以确保我们的测试完全不在正常构建之外.
我假设标记为#[test]未在发布版本中出现的函数,即使它们出现在一个模块中,对吧?我希望它只是测试辅助功能,可能会浪费空间.它们可以单独隐藏#[cfg(test)],对吧?
为什么-XImplicitParams从命令行工作而不是OPTIONS_GHC pragma?
我发现ghc t.hs抛出一个parse error on input 'a'if t.hs包含以下代码,同时ghc -XImplicitParams t.hs工作正常.同上ghci.
{- OPTIONS_GHC -XImplicitParams -}
f :: (?a :: Int) => Int -> Int
f b = ?a + b
g c = f $ c+1
Run Code Online (Sandbox Code Playgroud)