小编Dam*_*les的帖子

什么是具有合格进口的前奏的替代品

我们代码库中的几乎每个模块都有以下导入:

import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as Text
Run Code Online (Sandbox Code Playgroud)

我想定义一个本地前奏,这样Map,SetText可用的模块导入一个前奏.显然在Haskell中没有办法做到这一点.所以我想知道人们如何在大型Haskell代码库中解决这个问题.

haskell module

21
推荐指数
2
解决办法
761
查看次数

如何使用Yesod构建AngularJS应用程序

我设法使用Yesod成功编写了一个小应用程序.现在我处于我希望为其添加更好的交互的阶段,我想使用AngularJS来做到这一点.

据我所知,Yesod对AngularJS的支持仍然是实验性的.而且,到目前为止我找到的文档对我来说是无法访问的.我没有掌握所有的Yesod概念.

所以我想知道,有哪些方法可以集成AngularJS和Yesod框架.我在想的是:

  1. 在AngularJS中编写前端.
  2. 使用Yesod开发Web服务.
  3. 通过GET和POST http请求连接前端和Web服务.可以通过输入表单(以这种方式利用一些Yesod功能)将信息发送到服务器,并且可以通过JSON对象将信息发送到前端.

理想情况下,我想在Haskell中编写所有内容,但在目前的情况下可能不可能.因此,我想问一下,我想到的替代方案是否是一个好方法,以及是否有办法改进它.

谢谢.

javascript json haskell yesod angularjs

14
推荐指数
1
解决办法
874
查看次数

选择要使用Hspec和堆栈运行的测试

我使用Hspec 的自动规范发现功能编写了一系列测试.我也使用堆栈作为我的构建工具.

我的测试目录有该Spec.hs文件,用我的应用程序的不同模块(如测试文件一起Module0Spec.hs,Module1Spec.hs).

现在,当我开始编写新的测试模块时,或者当我想在代码更改后重新运行失败的测试时,我希望能够只运行给定的测试模块.

堆栈或Hspec是否允许这样做?

haskell hspec haskell-stack

10
推荐指数
1
解决办法
887
查看次数

Scala:类型参数中的问号

我试图理解下面的一段代码(来自Scalaz库):

def kleisliIdApplicative[R]: Applicative[Kleisli[Id, R, ?]] = ...
Run Code Online (Sandbox Code Playgroud)

我假设表单T[P0, ?]的类型是一个带参数的类型构造函数.但是,我无法找到解释类型参数中问号用法的文档.

一个相关的问题是问号和下划线之间有什么区别?

是否存在所有这些都有详细记录的地方?

scala scalaz type-parameter

9
推荐指数
1
解决办法
2165
查看次数

关于使用背包的例子

我正在查看backpack维基上的引用, 试图理解在哪些情况下使用backpack它将被认为适合于其他Haskell功能,如类型类和类型系列.

特别是,在作者的博客文章中backpack,提出了一个实例,用于实现正则表达式的简单匹配器.但据我所知,同一模块可以使用类型族进行编码.

是否有任何示例简明扼要地展示了背包相对于更传统的Haskell功能的优势?如果我上面提到的例子很好,你知道为什么使用类型系列的解决方案会不合适吗?

haskell typeclass type-families haskell-backpack

9
推荐指数
1
解决办法
287
查看次数

使用 newtype 构造函数映射的效果是什么

在第8章与思维类型我了解到fmap Sum的一部分

fastSum :: [Int] -> Int
fastSum = getSum . mconcat . fmap Sum
Run Code Online (Sandbox Code Playgroud)

O(n)运行时成本,而使用coerce则避免了这种开销。

我知道newtypes 没有表示开销,但我不明白的是将 newtype 构造函数映射到列表上的运行时效果是什么。我认为这只会有编译时开销,它应该只是O(1),因为编译器只需要知道fmap SomeNewtypeCtr表达式的类型。

haskell newtype

9
推荐指数
1
解决办法
105
查看次数

使用免费monad进行记录

这个问题与本文有关

我们的想法是定义一个用于操作云中文件的DSL,并定义一个解释器组合,负责处理不同方面,例如与REST接口的通信和日志记录.

为了使其更具体,假设我们有以下数据结构来定义DSL的术语.

data CloudFilesF a
= SaveFile Path Bytes a
| ListFiles Path ([Path] -> a)
deriving Functor
Run Code Online (Sandbox Code Playgroud)

我们定义了构建CloudFiles程序的函数,如下所示:

saveFile :: Path -> Bytes -> Free CloudFilesF ()
saveFile path bytes = liftF $ SaveFile path bytes ()

listFiles :: Path -> Free CloudFilesF [Path]
listFiles path = liftF $ ListFiles path id
Run Code Online (Sandbox Code Playgroud)

那么这个想法是用另外两个DSL解释这个:

data RestF a = Get Path (Bytes -> a)
         | Put Path Bytes (Bytes -> a)
         deriving Functor

data Level = Debug | Info …
Run Code Online (Sandbox Code Playgroud)

logging haskell functional-programming free-monad

8
推荐指数
1
解决办法
457
查看次数

由于使用严格的数据构造函数导致性能下降的示例

我正在阅读有关严格数据构造函数的内容.链接的维基文章指出,

"严格注释会使性能变差[因为]严格注释会强制编译器确保在构建构造函数之前完全评估该字段,如果事实证明该字段已经被评估过,那么这只是浪费的工作".

我不明白为什么如果该字段已经被评估它是浪费的工作,因为无论如何它都需要应用构造函数的值.

是否有一个例子说明了这个问题或其他因严格性而导致的效率损失?

haskell strictness

8
推荐指数
1
解决办法
96
查看次数

从堆栈项目生成Nix包

我有一个可以构建和安装的软件应用程序stack.我想为Linux和Mac提供二进制包.为此,我正在考虑nix,因为除其他外,它可以在Linux和Mac中使用.这将节省我必须维护两种包类型的麻烦.

在阅读了如何nix定义包之后,我希望stack可以使用如下配置构建基于项目的项目:

{ stdenv, fetchurl, stack }: # we need to depend on stack

stdenv.mkDerivation { 
  name = "some-haskell-package-0.1"; 
  builder = ./builder.sh; # here we would call `stack install` 
  src = fetchurl {  # ...
  };
}
Run Code Online (Sandbox Code Playgroud)

看一下在线可用的资源,我找不到任何关于如何做到这一点的描述.我不知道这是否意味着stack并且nix不打算以这种方式使用.

我能找到的手册中的唯一的事情就是如何stack可以使用nix,并且stacknix转换工具.

我也愿意接受多平台包装的替代方案.

haskell package-managers nix haskell-stack

8
推荐指数
1
解决办法
610
查看次数

Data.Functor.Coproduct在哪里.走?

我试图使用Data.Functor.Coproductcomonad,但它似乎在最新版本中已经消失了.

更改日志中提到它被弃用了Data.Functor.Sum,但我不知道在哪里可以找到一个等效的coproduct函数Sum:

coproduct :: (f a -> b) -> (g a -> b) -> Coproduct f g a -> b
Run Code Online (Sandbox Code Playgroud)

haskell packages

8
推荐指数
0
解决办法
142
查看次数