小编Maa*_*gon的帖子

Phoenix Framework的Plug.Conn中assign和put_session有什么区别?

文档(https://hexdocs.pm/plug/Plug.Conn.html)命名两个函数,允许在一个键值对中存储conn

assign(conn, key, value)
Run Code Online (Sandbox Code Playgroud)

为连接中的键分配值

put_session(conn, key, value)
Run Code Online (Sandbox Code Playgroud)

将指定值放在给定键的会话中

这两个功能有什么区别?

session elixir phoenix-framework

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

使用GHCi断点调试器来查找中间结果?

当函数的结果已知时,是否可以停止GHCi调试器?

例如,请考虑以下代码段:

blabla    :: [Int] -> Int
bla       :: Int -> Int
papperlap :: Int -> Int -> Int

bla x         = x+x
papperlap y x = ((y *) . bla) x
blabla xs     = foldl papperlap 0 x
Run Code Online (Sandbox Code Playgroud)

现在,我想看看'papperlap'和'bla'的结果.但请记住,我想在评估结果时停止.因此,使用':force'是不可能的,因为它改变了评估的顺序.

当我使用':break'时,调试器会停止,但_result尚未评估.请在下面找到我的GHCi会话,但不会产生所需的中间结果:

GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
[1 of 1] Compiling Main             ( bla1.hs, interpreted )
Ok, modules …
Run Code Online (Sandbox Code Playgroud)

debugging haskell lazy-evaluation

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

为什么Erlang会在高阶函数存在的情况下放弃生成堆栈跟踪?

当出现问题时,Erlang会产生很好的堆栈跟踪,当程序员想弄清楚它出错的原因时,这很有用.在存在更高阶函数的情况下,产生堆栈跟踪的机制似乎不足.例如,比较下面的两个例子(我在代码的注释中添加了生成的堆栈跟踪).

我读过之前为延迟评估(例如在Haskell中)生成堆栈跟踪的困难.但是由于Erlang被严格评估,我原本期望得到更好的结果.

我的问题是:什么使高阶函数成为Erlang用于生成堆栈跟踪的机制的问题?还有其他已知技术会产生更好的结果吗?

  1 -module(test).
  2 -export([f/1,a/1]).
  3 
  4 % Auxilary function to print stack trace (by throwing an exception).
  5 
  6 s(X) when X < 0 -> 0.
  7 
  8 % Example 1: Stack trace in presence of a higher order function.
  9 %
 10 % > test:f(1).
 11 % ** exception error: no function clause matching test:s(1) (test.erl, line 6)
 12 %      in function  test:g/2 (test.erl, line 15)
 13 
 14 f(X)   -> h(fun g/2,X).
 15 g(X,Y) -> …
Run Code Online (Sandbox Code Playgroud)

erlang strict stack-trace lazy-evaluation

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

在Idris中对矢量进行分区:为什么0和m + n不能统一?

我想在两个新的向量中划分一个向量.

我们无法知道单个向量的长度是多少,但结果向量的总和必须等于参数.我试图捕获此属性如下:

partition : (a -> Bool) -> Vect (m+n) a -> (Vect m a, Vect n a)
partition p [] = ([], [])
partition p (x::xs)
  = let (ys,zs) = partition p xs
  in case p xs of
    True  => (x::ys, zs)
    False => (ys, zs)
Run Code Online (Sandbox Code Playgroud)

但伊德里斯报告(指向"分区p []")在详细阐述Main.partition的左侧时:

Can't unify
        Vect 0 a
with
        Vect (m + n) a

Specifically:
        Can't unify
                0
        with
                plus m n
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

对我来说,似乎很明显,如果"0 = m + n"而不是m = n = 0.如果说服伊德里斯这个怎么样?

unify idris

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

Coq 中的对定义类型为“(Set * Set)%type”,而预期类型为“Type”

我正在阅读 Software Foundations(*) 并且在 Coq 中定义类型时遇到问题:在下面的示例中,我尝试进行 2 个类型定义。t1是自然数列表,并且t2是一对自然数。

第一个定义t1被 Coq 接受,但定义t2被拒绝并显示错误消息:

该术语(nat, nat)具有类型,(Set * Set)%type而预期具有类型Type

我不太明白出了什么问题以及这条消息的含义。定义有什么问题t2

  Definition t1 : Type := list nat.
  Definition t2 : Type := pair nat nat.
Run Code Online (Sandbox Code Playgroud)

(*) http://www.cis.upenn.edu/~bcpierce/sf/Lists.html#lab58

coq

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