我们代码库中的几乎每个模块都有以下导入:
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,Set和Text可用的模块导入一个前奏.显然在Haskell中没有办法做到这一点.所以我想知道人们如何在大型Haskell代码库中解决这个问题.
我设法使用Yesod成功编写了一个小应用程序.现在我处于我希望为其添加更好的交互的阶段,我想使用AngularJS来做到这一点.
据我所知,Yesod对AngularJS的支持仍然是实验性的.而且,到目前为止我找到的文档对我来说是无法访问的.我没有掌握所有的Yesod概念.
所以我想知道,有哪些方法可以集成AngularJS和Yesod框架.我在想的是:
理想情况下,我想在Haskell中编写所有内容,但在目前的情况下可能不可能.因此,我想问一下,我想到的替代方案是否是一个好方法,以及是否有办法改进它.
谢谢.
我试图理解下面的一段代码(来自Scalaz库):
def kleisliIdApplicative[R]: Applicative[Kleisli[Id, R, ?]] = ...
Run Code Online (Sandbox Code Playgroud)
我假设表单T[P0, ?]的类型是一个带参数的类型构造函数.但是,我无法找到解释类型参数中问号用法的文档.
一个相关的问题是问号和下划线之间有什么区别?
是否存在所有这些都有详细记录的地方?
我正在查看backpack维基上的引用, 试图理解在哪些情况下使用backpack它将被认为适合于其他Haskell功能,如类型类和类型系列.
特别是,在作者的博客文章中backpack,提出了一个实例,用于实现正则表达式的简单匹配器.但据我所知,同一模块可以使用类型族进行编码.
是否有任何示例简明扼要地展示了背包相对于更传统的Haskell功能的优势?如果我上面提到的例子很好,你知道为什么使用类型系列的解决方案会不合适吗?
在第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表达式的类型。
这个问题与本文有关
我们的想法是定义一个用于操作云中文件的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) 我正在阅读有关严格数据构造函数的内容.链接的维基文章指出,
"严格注释会使性能变差[因为]严格注释会强制编译器确保在构建构造函数之前完全评估该字段,如果事实证明该字段已经被评估过,那么这只是浪费的工作".
我不明白为什么如果该字段已经被评估它是浪费的工作,因为无论如何它都需要应用构造函数的值.
是否有一个例子说明了这个问题或其他因严格性而导致的效率损失?
我有一个可以构建和安装的软件应用程序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,并且stack要nix转换工具.
我也愿意接受多平台包装的替代方案.
我试图使用Data.Functor.Coproduct从comonad,但它似乎在最新版本中已经消失了.
在更改日志中提到它被弃用了Data.Functor.Sum,但我不知道在哪里可以找到一个等效的coproduct函数Sum:
coproduct :: (f a -> b) -> (g a -> b) -> Coproduct f g a -> b
Run Code Online (Sandbox Code Playgroud)