tl; dr:Arbitrary如果你的数据类型允许过多的嵌套,你如何编写不爆炸的实例?您如何保证这些实例能够生成真正随机的数据结构样本?
我想生成随机树结构,然后在用我的库代码修改它们之后测试这些结构的某些属性.(注意:我正在编写子类型算法的实现,即给定类型的层次结构,类型A是类型B的子类型.通过在层次结构中包含多继承和后初始化更新,可以使其任意复杂化不支持这些的经典方法是Schubert编号,我所知道的最新结果是Alavi et al.2008.)
我们来看玫瑰树的例子如下Data.Tree:
data Tree a = Node a (Forest a)
type Forest a = [Tree a]
Run Code Online (Sandbox Code Playgroud)
Arbitray的一个非常简单的(并且不用尝试在家)实例将是:
instance (Arbitrary a) => Arbitrary (Tree a) where
arbitrary = Node <$> arbitrary <$> arbitrary
Run Code Online (Sandbox Code Playgroud)
由于a已经有一个Arbitrary类型约束的实例,并且Forest将有一个,因为[]也是一个实例,这似乎是直截了当的.它不会(通常)以非常明显的原因终止:因为它生成的列表是任意长的,结构变得太大,并且它们很可能不适合内存.即使是更保守的方法:
arbitrary = Node <$> arbitrary <*> oneof [arbitrary,return []]
Run Code Online (Sandbox Code Playgroud)
因为同样的原因,再也不会工作了.人们可以调整大小参数,以保持列表的长度,但即使这样也不能保证终止,因为它仍然是多个连续的掷骰子,并且它可能会非常糟糕(我希望奇数节点有100个)孩子们.)
这意味着我需要限制整个树的大小.那不是那么直截了当.unordered-containers很简单:只需使用fromList.这在这里不是那么容易:你如何随机地将一个列表变成一棵树,而不会产生任何一种或另一种偏见(即不利于左分支,或者是非常左倾的树.)
列表中的某种广度优先构造(Data.Tree所有预先提供的功能)都很棒,我想我可以写一个,但结果却是非平凡的.由于我现在正在使用树,但是后来会使用更复杂的东西,我想我可能会尝试找到更通用,更简单的解决方案.有没有,还是我不得不求助于编写我自己的非平凡Arbitrary发电机?在后一种情况下,我实际上可能只是采用单元测试,因为这似乎太多了.
背景:我正在Haskell写一个玩具Lisp interperter /编译器,用于我自己的娱乐/启发.我试图添加编译为LLVM字节码的能力.
语境:我一直在阅读的文档LLVM.Core和代码示例(在这里),试图了解该组合的手段和抽象的手段(如描述阿伯尔森和萨斯曼计算机程序的结构与解释的哈斯克尔LLVM使用.)绑定.有很多小件,我不清楚他们打算如何合作.看起来基本的LLVM机器指令之上有一定程度的抽象,对于那些对LLVM有很多经验的人来说是显而易见的,但对于那些像我这样只是沾沾自喜的人来说,没有记录.
问:什么是CodeGenModule和CodeGenFunction它们是怎样被用来建立Functions和Modules?
我试图了解如何在Haskell中使用iteratee库.到目前为止,我所看到的所有文章似乎都专注于建立一个如何构建迭代的直觉,这是有帮助的,但现在我想要下来并实际使用它们,我觉得有点海上.查看iteratees的源代码对我来说价值有限.
假设我有这个函数修剪一行的尾随空格:
import Data.ByteString.Char8
rstrip :: ByteString -> ByteString
rstrip = fst . spanEnd isSpace
Run Code Online (Sandbox Code Playgroud)
我想做的是:将它变成一个iteratee,读取一个文件并将其写在其他地方,并从每一行中删除尾随空格.我将如何使用iteratees进行结构化?我看到有一个enumLinesBS在Data.Iteratee.Char功能,我可以下探到这一点,但我不知道我是否应该使用mapChunks或convStream或如何重新包装上面的功能于iteratee.
Sulzmann,Chakravarty和Peyton Jones 的论文"System F with Type Equality Coercions "用newtype以下例子说明了Haskell 到System FC 的翻译:
newtype T = MkT (T -> T)
Run Code Online (Sandbox Code Playgroud)
据我了解,禁止unsafePerformIO,这种类型的唯一可能的值是MkT id和MkT undefined因为parametricity的.我很好奇是否有这个(或类似的)定义的实际用途.
自GHC 7.8以来,Typeable是多元化的.查看文档中的内置Typeable实例列表,我注意到一些有趣的事情:
Typeable ((* -> *) -> Constraint) Alternative
Typeable ((* -> *) -> Constraint) Applicative
Typeable (* -> Constraint) Monoid
Run Code Online (Sandbox Code Playgroud)
显然,它允许查看(某些)类型的类型表示Constraint:
Prelude Data.Monoid Data.Typeable> typeRep $ (Proxy :: Proxy (Monoid Int))
Monoid Int
Run Code Online (Sandbox Code Playgroud)
这个功能有什么用途,还是只是偶然提供?
我想在生成的文档中包含源代码.当我ocamldoc在命令行上调用时,这可以工作:ocamldoc -I _build -html -keep-code -colorize-code *.{ml,mli} -d .docdir.但是,我遇到了麻烦ocamlbuild.
我正在使用以下代码myocamlbuild.ml:
open Ocamlbuild_plugin;;
dispatch begin function
| After_options ->
Options.ocamldoc := S[A"ocamldoc"; A"-keep-code"; A"-colorize-code"]
| _ -> ()
end
Run Code Online (Sandbox Code Playgroud)
但是这只包含没有相应接口文件的文件源 - 与此处所说的相反,它看起来像是在存在文件时ocamlbuild拒绝传递.ml文件.有没有办法哄ocamlbuild做我想要的?ocamldoc.mli
我正在寻找一个Haskell函数,它返回给定正则表达式的所有匹配的捕获组.
我一直在看Text.Regex,但在那里找不到任何东西.
现在我使用这个似乎有效的解决方法:
import Text.Regex
findNext :: String -> Maybe (String, String, String, [String] ) -> [ [String] ]
findNext pattern Nothing = []
findNext pattern (Just (_, _, rest, matches) ) =
case matches of
[] -> (findNext pattern res)
_ -> [matches] ++ (findNext pattern res)
where res = matchRegexAll (mkRegex pattern) rest
findAll :: String -> String -> [ [String] ]
findAll pattern str = findNext pattern (Just ("", "", str, [] ) )
Run Code Online (Sandbox Code Playgroud)
结果: …
我尝试在Haskell中打印函数只是为了好玩,就像这个例子:
{-# LANGUAGE FlexibleInstances #-}
instance Show (Int -> Bool) where
show _ = "function: Int -> Bool"
Run Code Online (Sandbox Code Playgroud)
在GHCi中加载并运行和示例:
?> :l foo
[1 of 1] Compiling Main ( foo.hs, interpreted )
foo.hs:2:1: Warning: Unrecognised pragma
Ok, modules loaded: Main.
?> (==2) :: Int -> Bool
function: Int -> Bool
Run Code Online (Sandbox Code Playgroud)
但是,我希望看到每个函数都在调用时自行打印.
haskell ×9
bytestring ×1
cabal ×1
function ×1
iterate ×1
iteration ×1
llvm ×1
ocaml ×1
ocamlbuild ×1
ocamldoc ×1
quickcheck ×1
regex ×1
testing ×1