小编Dav*_*vid的帖子

为代数数据类型定义TH Lift实例

假设我有一个带有多个构造函数的代数数据类型,比如

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中执行此操作,以便我不必为每个数据构造函数再次编写相同的行?

haskell template-haskell

7
推荐指数
1
解决办法
184
查看次数

Haskell FFI:与简单的C++接口?

从我到目前为止所读到的内容来看,使用FFI和C++很难实现.其中一个最大的原因似乎是将C++对象转换为Haskell.我现在的问题是我没有任何使用C的经验,但是使用C++几年,我也更喜欢OOP.因此,我自然希望从C++中受益.

那么我可以编写设计用于Haskell FFI的C++程序来解决这些问题吗?C++可以做任何事情,但API会像C一样,即我不交换对象,没有重载的顶级函数等等.是否有任何陷阱需要注意?

(将我的项目与您可能熟悉的项目进行比较:考虑使用SciPy的Weave来加速Python代码.)

c++ haskell ffi

6
推荐指数
1
解决办法
1402
查看次数

使用Parsec编写一个Read实例

使用Parsec,我能够String -> Maybe MyType相对轻松地编写一个类型的函数.我现在想Read基于它为我的类型创建一个实例; 但是,我不明白readsPrec它是如何工作的或它应该做什么.

我现在最好的猜测readsPrec是用于从头开始构建一个递归解析器来遍历一个字符串,在Haskell中构建所需的数据类型.但是,我已经拥有一个非常强大的解析器,它为我做了那件事.那么如何告诉readsPrec我使用我的解析器呢?什么是"运算符优先级"参数,它在我的上下文中有什么用?

如果它有帮助,我在Github上创建了一个最小的例子.它包含一个类型,一个解析器和一个空白的Read实例,并且很好地反映了我被卡住的地方.

(背景:真正的解析器用于Scheme.)

parsing haskell parsec

6
推荐指数
1
解决办法
506
查看次数

独自运行Haddock

我想开始使用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)解决方案吗?

haskell haddock

5
推荐指数
1
解决办法
1576
查看次数

关于评估,Haskell是否有可耻的变化?

在研究并行编程和随后的评估策略时,出现了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还是3bar

haskell lazy-evaluation seq

3
推荐指数
1
解决办法
197
查看次数

标签 统计

haskell ×5

c++ ×1

ffi ×1

haddock ×1

lazy-evaluation ×1

parsec ×1

parsing ×1

seq ×1

template-haskell ×1