文档(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)
将指定值放在给定键的会话中
这两个功能有什么区别?
当函数的结果已知时,是否可以停止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) 当出现问题时,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) 我想在两个新的向量中划分一个向量.
我们无法知道单个向量的长度是多少,但结果向量的总和必须等于参数.我试图捕获此属性如下:
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.如果说服伊德里斯这个怎么样?
我正在阅读 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)