小编PLL*_*PLL的帖子

Haskell:隐藏模块导出中的特定功能?

我有一个Haskell模块,我希望它导出在其文件中声明的所有对象,除了一个特定的函数local_func.

是否有一种更清晰的方法来实现这一点,而不是通过编写明确列出所有其他声明的导出列表(并仔细保持此列表最新的所有永恒)?

换句话说,我想要一个类似的import MyModule hiding (local_func),但在导出模块中指定而不是在导入时指定.

haskell module

34
推荐指数
2
解决办法
5171
查看次数

Haskell:`Map(a,b)c`对`map a(Map bc)`?

将地图视为有限函数的表示,可以以咖喱或非曲线的形式给出两个或更多变量的映射; 也就是说,类型Map (a,b) cMap a (Map b c)同构,或接近它的东西.

有哪些实际考虑 - 效率等 - 用于在两种表示之间进行选择?

haskell map currying

21
推荐指数
1
解决办法
638
查看次数

Haskell monads:`(>> =)`和`(= <<)`的名称是什么?

我已经和Haskell一起玩了好几年了; 我对monad如何工作,如何使用它们以及操作员(=<<)(>>=)做什么感到很满意.

但我还是不知道如何谈论它们!对于他们的工作是否有任何标准术语 - 将箭头a -> m b转换为箭头的动作m a -> m b

(作为背景的数学家,脑海中浮现的一个选项是"来自Kleisli类别的遗忘函子".但是Haskell大师肯定会有一些更简洁的术语,因为在Haskell中,这个操作被用作其中一个构建块. monads,与通常被认为是派生操作的数学设置不同,从乘法和functoriality定义!)

monads haskell

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

Coq:使用子目录管理项目中的LoadPath

我有一个Coq项目,其库被组织成子目录,如:

…/MyProj/Auxiliary/Aux.v
…/MyProj/Main/Main.v  (imports Auxiliary/Aux.v)
Run Code Online (Sandbox Code Playgroud)

当我编译文件时,我希望从工作目录MyProj(通过makefile)这样做.但是我也想使用Proof General/Coqtop来处理文件,在这种情况下,工作目录默认是文件所在的目录.

但这意味着两个上下文之间的LoadPath是不同的,因此库导入所需的逻辑路径是不同的.如何设置coqc调用,LoadPath和导入声明,以便它们在两个上下文中都能工作?

我尝试过的每种方法都出了问题.例如,如果我Aux.v通过调用编译

coqc -R "." "MyProj" Auxiliary/Aux.v
Run Code Online (Sandbox Code Playgroud)

并将其导入Main.v

Require Import MyProj.Auxiliary.Aux.
Run Code Online (Sandbox Code Playgroud)

然后,当我编译时Main.v,这工作

coqc -R "." "MyProj" Main/Main.v
Run Code Online (Sandbox Code Playgroud)

但在Coqtop失败了Error: Cannot find library MyProj.Auxiliary.Aux in loadpath.另一方面,如果在Require Import我添加之前

Add LoadPath ".." as MyProj.
Run Code Online (Sandbox Code Playgroud)

然后这在Coqtop中工作,但是失败coqc -R "." "MyProj" Main/Main.v

Error: The file […]/MyProj/Auxiliary/Aux.vo contains library
Run Code Online (Sandbox Code Playgroud)

MyProj.Auxiliary.Aux而不是库MyProj.MyProj.Auxiliary.Aux

我正在寻找一个对于与协作者共享的库(并希望最终与用户共享)的强大解决方案,因此特别是它不能使用绝对文件路径.我现在发现的最好的方法是在Proof General调用Coqtop时添加emacs局部变量来设置LoadPath:

((coq-mode . ((coq-prog-args . ("-R" ".." "MyProj" "-emacs")))))
Run Code Online (Sandbox Code Playgroud)

但是这个(a)似乎有点hacky,而且(b)只适用于Proof General,而不适用于Coqide或普通的Coqtop.有更好的解决方案吗?

coq

8
推荐指数
2
解决办法
1496
查看次数

从Haskell输出ascii动画?

我正在尝试使用Haskell生成一些非常快速和脏的动画显示.最简单的尝试似乎是ASCII艺术 - 换句话说,就是:

type Frame = [[Char]]     -- each frame is given as an array of characters

type Animation = [Frame]

display :: Animation -> IO ()
display = ??
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能做到最好?

我根本无法弄清楚的部分是如何确保帧之间的最小暂停; 其余的是简单的使用putStrLn连同clearScreen来自ANSI-终端包,通过发现这样的回答.

animation haskell ascii-art

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

Haskell:标准库假设Eq和Ord兼容吗?

这是对Inconsistent Eq和Ord实例的后续问题.

现在的问题有本质上是:当声明EqOrd一个类型的情况下,必须确保compare x y收益EQ当且仅当x == y回报True?创建打破这种假设的实例是危险的吗?这似乎是一个人们可能会假设的自然法则,但它似乎并未在序言中明确说明,与monad或functor法则不同.

基本的回答是:这样做有点危险,因为图书馆可能认为这个法律成立了.

我现在的问题是:是否有任何标准库(特别是SetMap)做出这样的假设?它是危险的有型不兼容EqOrd,只要我只依靠与GHC提供的标准库? (如果仍然可以接受大名单问题,我会问:哪些常用的图书馆会采用这个法律?)

编辑.我的用例类似于原始问题的用例.我有一个自定义实例的类型Eq,我使用了很多.我想要的唯一原因Ord是我可以将它用作a的域Map; 我不关心具体的顺序,也绝不会在代码中明确使用它.因此,如果我可以使用派生的实例Ord,那么我的生活将更容易,我的代码更清晰.

haskell typeclass

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

告诉 Jekyll(在 github 页面上)将 README.md 转换为 README.html,而不是 index.html

我正在使用 Jekyll 构建一个项目网页,在 Github Pages 上,使用“Dinky”主题,开箱即用。

README.md被自动转换为index.html,这是快速入门非常有帮助。

但是,我想要一个单独编写的主页index.md,而是转换README.mdREADME.html(就像大多数*.md文件一样)。当我加我index.md,杰基尔将其转换为index.html如希望的那样,但现在所有的没有给出转换README.md-大概是它index.html的目标都README.mdindex.md,而后者获胜。

我如何告诉 Jekyll 返回使用README.html作为其转换目标README.md

最好,我想要一个不需要README.md本身添加配置数据的解决方案,这样我就可以继续README.mdmaster分支中的人类可读版本保持同步。

复制它的注意事项:所有这些都发生在通过 Github Pages 在线构建时,以及使用本地jekyll build. 唯一的自定义设置杰基尔我用的是gem 'github-pages', group: :jekyll_plugins在现场的Gemfile,并theme: jekyll-theme-dinky在该网站的_config.yml

它似乎特定于 Github Pages 主题,而不是 Dinky 主题:除 Dinky 之外的其他主题表现出相同的行为,但裸露的 Jekyll 站点似乎没有。


编辑:感谢@wasthishelpful 提供非常有用的评论和部分答案。将 YAML …

github jekyll github-pages

6
推荐指数
2
解决办法
1803
查看次数

在"git fetch"中中止是否安全?

我刚刚开始fetch使用大型远程git仓库.不幸的是,之后我才意识到由于连接不良,需要几个小时才能完成.发出ctrl-C(或以其他方式终止git进程)是否安全,稍后再尝试更好的连接?或者是否存在由此产生问题的风险 - 我当地的仓库还处于腐败状态,还是什么?

git

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

LFTP:保存特定服务器的用户名/密码?

我可以在某个本地配置文件中为ftp服务器保存用户名/密码对,以便lftp在连接到该服务器时自动找到它们吗?

背景:我有一些脚本,将由多个用户使用,具有不同的用户名/密码对,以将一些生成的内容从存储库同步到ftp服务器.不必每次都手动输入我们的用户名/密码.由于ftp密码以明文形式发送,因此我们都使用低值密码,因此将密码以明文形式存储在本地配置文件中是可以接受的.

passwords ftp configuration lftp

2
推荐指数
1
解决办法
3646
查看次数

Haskell 的严格折叠真的使用线性空间吗?

我以为我了解 Haskell 中折叠性能的基础知识,如Haskell Wiki和许多其他地方的foldrfoldlfoldl'中所述。特别是,我了解到对于累积函数,应该使用foldl', 以避免空间泄漏,并且编写标准库函数以尊重这一点。所以我假设简单的累加器(如length)应用于简单的列表(如replicate n 1)应该在列表的长度上需要恒定的空间(或至少是次线性的)。我的直觉是,在足够简单的列表上,它们的行为大致类似于for命令式语言中的循环。

但是今天我发现这在实践中似乎并不成立。例如,length $ replicate n 1似乎在n. ghci

ghci> :set +s
ghci> length $ replicate (10^6) 1
1000000
(0.02 secs, 56,077,464 bytes)
ghci> length $ replicate (10^7) 1
10000000
(0.08 secs, 560,078,360 bytes)
ghci> length $ replicate (10^8) 1
100000000
(0.61 secs, 5,600,079,312 bytes)
ghci> length $ replicate (10^9) 1
1000000000
(5.88 …
Run Code Online (Sandbox Code Playgroud)

memory performance haskell lazy-evaluation fold

2
推荐指数
1
解决办法
111
查看次数