标签: haskell-backpack

如何在Haskell中按模块对函数进行参数化?

这似乎是人为的,但是我似乎找不到以下答案:

说我有以下进口:

import qualified Data.Map as M
import qualified Data.HashMap.Lazy as HML
Run Code Online (Sandbox Code Playgroud)

现在,我有了一些函数(comp),该函数需要一些列表,执行某些操作,创建地图并返回它。

我的问题是我如何有两种调用方式,comp以便正确调用insertsize映射?

作为一名稻草人,我可以编写此函数的两个副本,一个引用M.insertM.size,而另一个引用HML.insertHML.size...,但是我如何“将模块作为参数传递”,或者另外指出呢?

谢谢!

编辑:为了使这个不太抽象,这些是的确切定义comp

mapComp :: KVPairs -> IO ()
mapComp kvpairs = do
  let init = M.empty
  let m = foldr ins init kvpairs where
        ins (k, v) t = M.insert k v t
  if M.size m /= length kvpairs
  then putStrLn $ "FAIL: " ++ show …
Run Code Online (Sandbox Code Playgroud)

haskell haskell-backpack

10
推荐指数
2
解决办法
217
查看次数

关于使用背包的例子

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

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

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

haskell typeclass type-families haskell-backpack

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

以向后兼容的方式使用Cabal背包

Backpack承诺让我们通过在签名上参数化包来解决字符串问题.我们的想法是,这将允许我们以向后兼容的方式改变生态系统:我们可以简单地弃用特定的实例,而不会改变依赖图.

我正在努力看到的是如何以向后兼容的方式使用Backpack.AFAICT,一个背包项目必须使用Cabal 2.0(以前版本的Cabal不支持.cabal文件中的所有新字段).这意味着我只能在支持GHC 8.2+的项目中使用背包.

这周围有什么黑客攻击吗?我正在寻找一种使用背包的方法:

  • GHC 8.2+的用户可以充分利用背包
  • 旧版本上的用户仍然可以编译和使用该项目(但是会遇到一些默认的签名实例)

haskell cabal haskell-backpack

6
推荐指数
0
解决办法
359
查看次数

Haskell中的模块签名是什么?

我最近发现Haskell的功能称为“模块签名”。如我所知,它们被放入.hsig文件中,并以signature关键字而不是开头module。这样的文件的示例语法可能看起来像

signature Str where

data Str
empty :: Str
append :: Str -> Str -> Str
Run Code Online (Sandbox Code Playgroud)

但是,我无法想象人们将如何以及为什么使用它们。您能否解释一下它们解决了哪些问题以及如何正确利用它们?

他们强烈地提醒我可以在OCaml(link)中看到的模块系统,它也具有模块签名和单独的实现,但是我无法确定这两个概念有多接近。有关系吗?

haskell haskell-backpack

5
推荐指数
0
解决办法
185
查看次数