小编mlj*_*jrg的帖子

为什么 Dialyzer 没有捕捉到这个简单的错误?

Dialyzer 不会发出此函数返回类型不一致的信号:

-spec myfun(integer()) -> zero | one.
myfun(0) -> zero;
myfun(1) -> one;
myfun(2) -> other_number.
Run Code Online (Sandbox Code Playgroud)

但它在最后一行的情况下检测到

myfun(_) -> other_number.
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我相信以上应该是一个非常简单的案例。

谢谢

erlang dialyzer

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

在 Asciidoctor 中嵌套项目符号列表和段落

我应该如何编写 Asciidoc(tor) 以获得以下输出:

* item 1
  * item a
    paragraph 1 inside item a
      * item a.1 inside paragraph 1 inside item a
        paragraph a.1 inside item a.1
      * item a.2 inside paragraph 1 inside item a
        paragraph a.2 inside item a.1
    paragraph 2 inside item a
  * item b
    paragraph 1 inside item b
* item 2
Run Code Online (Sandbox Code Playgroud)

更新:@TigerTV.ru 提出了一个不错的技巧,但它需要能够在项目符号列表中隐藏项目符号。如何才能做到这一点?

谢谢

asciidoc asciidoctor

5
推荐指数
2
解决办法
2122
查看次数

Haskell规则用于在Int,Double和Integer的类型实例之间进行选择

我想知道在GHCi中评估表达式时,Haskell使用的规则总是决定Integer实例而不是其他实例1 .+. 2:

import Debug.Trace

class MyFuns a where
    (.+.) :: a ?  a ?  a

instance MyFuns Double where
    x .+. y = trace "Double " $ x + y

instance MyFuns Integer where
    x .+. y = trace "Integer " $ x + y

instance MyFuns Int where 
    x .+. y = trace "Int " $ x + y
Run Code Online (Sandbox Code Playgroud)

编辑:如果我在文件的末尾添加以下代码

main = do
   let x = 1 .+. 2
   print x
Run Code Online (Sandbox Code Playgroud)

为什么我会收到此错误?

No instance for …
Run Code Online (Sandbox Code Playgroud)

haskell

4
推荐指数
1
解决办法
353
查看次数

为什么 PostgreSQL 会中止这个可序列化的计划

理论指出,一组并发事务是可序列化的,当且仅当它们的并发执行等效于其中一个可能的串行执行。

现在下面的事务T1和T2的并发执行是可串行化的,因为等价于串行执行“T1然后T2”

T1: r1x   w1y  c1
T2:    w2x   c2

(i.e., T1 reads x, T2 writes x, T1 writes y, T2 commits, and finally, T1 commits)
Run Code Online (Sandbox Code Playgroud)

但是,在 PostgreSQL 10.4 中尝试时,如下所示:

T1: begin
T1: set transaction isolation level serializable;
T2: begin
T2: set transaction isolation level serializable;
T2: update variables set value = value + 1 where name = 'x'
T1: update variables set value = value + 1 where name = 'y'
T2: commit
T1: commit
Run Code Online (Sandbox Code Playgroud)

当此事务尝试提交时,数据库将中止 T1。为什么?

postgresql concurrency transactions serializable

4
推荐指数
1
解决办法
195
查看次数

如何内省Haskell文件以获取其定义的类型

我有许多文件必须自动处理.每个文件保存一个学生对练习的响应,该练习要求学生给出每个功能类型的某些功能的定义.

我的想法是有一个Haskell脚本加载每个学生文件,并验证每个函数是否具有预期的类型.

约束是学生文件未定义为模块.

我怎样才能做到这一点?

到目前为止,我最好的选择是生成GHCi进程,该进程将使用GHCi命令从"测试文件"中读取stdin,例如:

:load student1.hs
:t g
... and so on ...
Run Code Online (Sandbox Code Playgroud)

然后从GHCi解析返回的输出以查找student文件中的函数类型.

是否有另一种干净的方法来加载任意Haskell文件并内省其代码?

谢谢

haskell

3
推荐指数
2
解决办法
290
查看次数

奇怪的Haskell行为:记录语法错误的错误?

鉴于以下代码,为什么Haskell只在到达第二个时报告错误id

data TypeX = TypeX {
         id :: Int        -- why not the error here?
       , val :: String
       } deriving (Show)
var1 = TypeX 1 "bananas"
var2 = TypeX {
       val = "oranges"
     , id = 2              -- why an error here?
     }
Run Code Online (Sandbox Code Playgroud)

错误是:

ghci> :l TypeX.lhs
[1 of 1] Compiling Main             ( TypeX.lhs, interpreted )

TypeX.lhs:8:13:
Ambiguous occurrence ‘id’
It could refer to either ‘Main.id’, defined at TypeX.lhs:2:15
                      or ‘Prelude.id’,
                         imported from ‘Prelude’ at TypeX.lhs:1:1
                         (and …
Run Code Online (Sandbox Code Playgroud)

haskell

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

如何在不阻止Haskell中的线程的情况下从进程检索输出

在不阻塞的情况下写入标准输入和从子进程的标准输出读取的最佳方法是什么?

通过创建子流程,通过该子流程System.IO.createProcess返回用于写入和读取子流程的句柄。书写和阅读以文本格式完成。

例如,我做非阻塞读取的最佳尝试是timeout 1 $ hGetLine out返回a Just "some line"Nothing如果不存在要读取的行。但是,对我来说这似乎是一个hack,因此我正在寻找一种更“标准”的方式。

谢谢

haskell

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

Vim 映射到用字符包围单词

在我的 vimrc 文件中,我有以下条目用“+”包围单词:

:nnoremap <silent> q+ wbi+<ESC>ea+<Esc>
Run Code Online (Sandbox Code Playgroud)

我想更改此设置以用任何其他符号(例如引号)包围单词,但我不想使用另一个插件或插入另一个地图。我想在我的 vimrc 中添加这样的内容:

:nnoremap <silent> qX wbiX<ESC>eaX<Esc>
Run Code Online (Sandbox Code Playgroud)

其中 X 是放置在单词周围的字符。

在 VIM 中如何做到这一点?

谢谢

vim

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

为什么这个OCaml语法错误

我在Ocaml中有这个代码

let double x = 2 * x

let triple x = 3 * x

let s = "Hello" in print_endline s

let () = triple 10 |> string_of_int |> print_endline
Run Code Online (Sandbox Code Playgroud)

并且在使用ocamlc file.ml此编译时会出现错误:

File "file.ml", line 5, characters 16-18:
Error: Syntax error
Run Code Online (Sandbox Code Playgroud)

如果我;;像这样放在第3行的末尾

let triple x = 3 * x;;
Run Code Online (Sandbox Code Playgroud)

如果我像这样评论第5行中的字符16-18

let s = "Hello" (* in print_endline s *)
Run Code Online (Sandbox Code Playgroud)

语法错误消失了.

有人可以解释语法错误的原因,以及这两个更正中的每一个都可以解决它吗?

ocaml syntax-error

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

使用Lisp宏无法实现的Haskell monad可以做什么,反之亦然?

我目前的理解是宏可以实现任何可以想象的概念,包括monad,因为它们"手头有编译器".这是真的?例如,我遇到过这个链接

请给我一些事实和例子,没有激情的答案.谢谢.

lisp macros monads haskell

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

Erlang Ports vs Nodes都是用X编写的,其中X不是Erlang VM语言

我已经阅读了Erlang文档,特别是有关Erlang PortsErlang Nodes的主题.

本教程使用相同的示例来说明这两个概念,即服务于两个简单函数的程序,但尽管存在一些通信协议差异,但它并未阐明使用这两个概念的优缺点.

乍一看,似乎端口更容易在外部语言中设置服务器,但我想知道Erlang端口可以提供哪些Erlang端口不能,反之亦然.

任何人都可以澄清Erlang Ports vs Nodes的功能和非功能方面吗?

谢谢

澄清更新

我真正想要比较的是用非ErlangVM语言编写的Erlang Ports vs Node(我知道Erlang节点是完整的Erlang VM,因此比Ports强大得多).例如,C端口可以做什么C节点不能,反之亦然?

erlang elixir

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