假设我有一个带有多个构造函数的代数数据类型,比如
data Animal a = Mouse a | Beaver a | Rabbit a
Run Code Online (Sandbox Code Playgroud)
我如何Lift有效地创建实例?最简单的方法是
instance (Lift a) => Lift (Animal a) where
lift (Mouse x) = [| Mouse x |]
lift (Beaver x) = [| Beaver x |]
lift (Rabbit x) = [| Rabbit x |]
Run Code Online (Sandbox Code Playgroud)
但这非常多余.当然,我不能直接抽象出不同的动物lift x = [| x |],尽管概念上它与我想要实现的相似.有没有办法在TH中执行此操作,以便我不必为每个数据构造函数再次编写相同的行?
从我到目前为止所读到的内容来看,使用FFI和C++很难实现.其中一个最大的原因似乎是将C++对象转换为Haskell.我现在的问题是我没有任何使用C的经验,但是使用C++几年,我也更喜欢OOP.因此,我自然希望从C++中受益.
那么我可以编写设计用于Haskell FFI的C++程序来解决这些问题吗?C++可以做任何事情,但API会像C一样,即我不交换对象,没有重载的顶级函数等等.是否有任何陷阱需要注意?
(将我的项目与您可能熟悉的项目进行比较:考虑使用SciPy的Weave来加速Python代码.)
使用Parsec,我能够String -> Maybe MyType相对轻松地编写一个类型的函数.我现在想Read基于它为我的类型创建一个实例; 但是,我不明白readsPrec它是如何工作的或它应该做什么.
我现在最好的猜测readsPrec是用于从头开始构建一个递归解析器来遍历一个字符串,在Haskell中构建所需的数据类型.但是,我已经拥有一个非常强大的解析器,它为我做了那件事.那么如何告诉readsPrec我使用我的解析器呢?什么是"运算符优先级"参数,它在我的上下文中有什么用?
如果它有帮助,我在Github上创建了一个最小的例子.它包含一个类型,一个解析器和一个空白的Read实例,并且很好地反映了我被卡住的地方.
(背景:真正的解析器用于Scheme.)
我想开始使用Haddock; 主要原因不是我(或其他任何人)需要不错的HTML文档来处理我现在正在编写的内容,但它会教我一种标注方式来评论Haskell模块.出于这个原因,我想弄清楚它,但我遇到了一个非常基本的问题.
资源:
module Main where
-- |This is the main function.
main = putStrLn "Hello World!"
Run Code Online (Sandbox Code Playgroud)
Haddock调用:
> haddock -h test.hs
Haddock coverage:
50% ( 1 / 2) in 'Main'
Warning: Main: could not find link destinations for:
GHC.Types.IO
Run Code Online (Sandbox Code Playgroud)
看起来Haddock不知道在哪里寻找标准库,但这只是一个疯狂的猜测.文档说了一些关于"-B"参数的内容,但并没有真正解释它.
我在网上搜索过这个问题,基本上回答"使用Cabal包,它会为你做的一切".但是,我现在宁愿不与Cabal打交道,而是自己学习Haddock(Cabal可以等).这个问题有一个很好的,简单的(ish)解决方案吗?
在研究并行编程和随后的评估策略时,出现了thunk是否可变的问题.举个例子,假设我有以下代码:
foo = 1 + 2 -- Thunk
bar = foo `seq` foo -- Evaluates foo
Run Code Online (Sandbox Code Playgroud)
seq在评估bar评估时调用foo,给出bar正常的表单值3.此评估是否foo也会影响?也就是说,评估之后是foo静止的1+2还是3值bar?