这似乎是人为的,但是我似乎找不到以下答案:
说我有以下进口:
import qualified Data.Map as M
import qualified Data.HashMap.Lazy as HML
Run Code Online (Sandbox Code Playgroud)
现在,我有了一些函数(comp),该函数需要一些列表,执行某些操作,创建地图并返回它。
我的问题是我如何有两种调用方式,comp以便正确调用insert并size映射?
作为一名稻草人,我可以编写此函数的两个副本,一个引用M.insert和M.size,而另一个引用HML.insert和HML.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) 我正在查看backpack维基上的引用, 试图理解在哪些情况下使用backpack它将被认为适合于其他Haskell功能,如类型类和类型系列.
特别是,在作者的博客文章中backpack,提出了一个实例,用于实现正则表达式的简单匹配器.但据我所知,同一模块可以使用类型族进行编码.
是否有任何示例简明扼要地展示了背包相对于更传统的Haskell功能的优势?如果我上面提到的例子很好,你知道为什么使用类型系列的解决方案会不合适吗?
Backpack承诺让我们通过在签名上参数化包来解决字符串问题.我们的想法是,这将允许我们以向后兼容的方式改变生态系统:我们可以简单地弃用特定的实例,而不会改变依赖图.
我正在努力看到的是如何以向后兼容的方式使用Backpack.AFAICT,一个背包项目必须使用Cabal 2.0(以前版本的Cabal不支持.cabal文件中的所有新字段).这意味着我只能在支持GHC 8.2+的项目中使用背包.
这周围有什么黑客攻击吗?我正在寻找一种使用背包的方法:
我最近发现Haskell的功能称为“模块签名”。如我所知,它们被放入.hsig文件中,并以signature关键字而不是开头module。这样的文件的示例语法可能看起来像
signature Str where
data Str
empty :: Str
append :: Str -> Str -> Str
Run Code Online (Sandbox Code Playgroud)
但是,我无法想象人们将如何以及为什么使用它们。您能否解释一下它们解决了哪些问题以及如何正确利用它们?
他们强烈地提醒我可以在OCaml(link)中看到的模块系统,它也具有模块签名和单独的实现,但是我无法确定这两个概念有多接近。有关系吗?