小编Tor*_*nny的帖子

Haskell中GHC.Prim中"let x = x in x"和"data Float#"的含义是什么

我查看了GHC.Prim的模块,发现似乎GHC.Prim中的所有数据都被定义为data Float#没有类似的东西=A|B,并且GHC.Prim中的所有函数都被定义为gtFloat# = let x = x in x.

我的问题是这些定义是否有意义以及它们的含义.

我检查了GHC.Prim的标题,如下所示

{-
This is a generated file (generated by genprimopcode).
It is not code to actually be used. Its only purpose is to be
consumed by haddock.
-}
Run Code Online (Sandbox Code Playgroud)

我想它可能与问题有一些关系,谁可以向我解释.

haskell ghc haddock

15
推荐指数
2
解决办法
2220
查看次数

如何让Haskell或ghci能够显示中文字符并运行名为scripts的汉字?

我想制作一个Haskell脚本来读取/ home文件夹中的文件.但是有许多以中文字符命名的文件,而Haskell和Ghci无法管理它.似乎Haskell和Ghci不擅长显示UTF-8字符.

这是我遇到的:

Prelude> "?Haskell??Ghci??????????????????"

"\35753Haskell\25110\32773Ghci\33021\27491\30830\26174\31034\27721\23383\24182\19988\35835\21462\27721\23383\21629\21517\30340\25991\26723"
Run Code Online (Sandbox Code Playgroud)

unicode haskell character cjk ghci

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

为什么Haskell序列函数不能是懒惰的,或者为什么递归monadic函数不能是懒惰的

使用问题列出按广度优先顺序列出目录的所有内容效率低下我了解到效率低是由于递归monad函数的奇怪行为.

尝试

sequence $ map return [1..]::[[Int]]
sequence $ map return [1..]::Maybe [Int]
Run Code Online (Sandbox Code Playgroud)

和ghci将陷入无休止的计算.

如果我们以更易读的形式重写序列函数,如下所示:

sequence' []     = return []
sequence' (m:ms) = do {x<-m; xs<-sequence' ms; return (x:xs)}
Run Code Online (Sandbox Code Playgroud)

并尝试:

sequence' $ map return [1..]::[[Int]]
sequence' $ map return [1..]::Maybe [Int]
Run Code Online (Sandbox Code Playgroud)

我们得到了相同的情况,无休止的循环.

尝试一个有限的列表

sequence' $ map return [1..]::Maybe [Int]
Run Code Online (Sandbox Code Playgroud)

Just [1,2,3,4..]经过很长时间的等待,它会弹出预期的结果.

根据我们的尝试,我们可以得出结论,尽管序列的定义"似乎是懒惰的,但它是严格的,并且必须在序列结果之前得出所有数字"才能打印出来.

如果我们定义一个函数,不仅仅是序列'

iterateM:: Monad m => (a -> m a) -> a -> m [a]
iterateM f x = (f x) >>= iterateM0 f …
Run Code Online (Sandbox Code Playgroud)

monads recursion haskell loops lazy-evaluation

12
推荐指数
3
解决办法
3750
查看次数

如何或是否有可能证明或伪造`forall(PQ:Prop),(P - > Q) - >(Q - > P) - > P = Q.在Coq中?

我想forall (P Q : Prop), (P -> Q) -> (Q -> P) -> P = Q.在Coq中证明或伪造.这是我的方法.

Inductive True2 : Prop :=
 | One : True2
 | Two : True2.

Lemma True_has_one : forall (t0 t1 : True), t0 = t1.
Proof.
  intros.
  destruct t0. destruct t1.
  reflexivity.
Qed.

Lemma not_True2_has_one : (forall (t0 t1 : True2), t0 = t1) -> False.
Proof.
  intros.
  specialize (H One Two).
  inversion H.
Run Code Online (Sandbox Code Playgroud)

但是,inversion H什么都不做.我想也许是因为coq的证明独立性(我不是英语母语,我不知道确切的词,请原谅我的无知),而且coq使得无法证明One = Two - > False.但是,如果是这样,为什么必须消除证据的内容? …

equality proof coq curry-howard dependent-type

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

如何重塑Caffe中的blob?

如何重塑形状的团块N x C x H x W,以N x 1 x (C*H) x W在来自Caffe?

我想制作一个卷积层,其权重在通道之间是相同的.

一种方法我想出是重塑形的底部BLOB N x C x H x W,以N x 1 x (C*H) x W和在其上面放置一个卷积层.但我只是不知道如何重塑一个blob.

请帮帮我,谢谢.

neural-network reshape deep-learning caffe

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

是否有可能通过向Haskell添加一个新功能(我称之为"子类型系统")来在Haskell中编写的程序中找到大多数错误?

我已经学习了大约一年的Haskell,并提出了一个问题,有才能的编译器编写者可以添加一个名为"子集"的新功能来增强Haskell的类型系统以捕获许多错误,包括编译阶段的IOExceptions.我是类型理论的新手,并原谅我的一厢情愿.

我最初的目的不是如何解决问题,而是知道是否存在相关的解决方案,但由于某些原因,解决方案没有引入Haskell.

除了一些小事之外,Haskell在我的脑海里几乎是完美的,我将在以下几行中向Haskell表达我对未来的愿望.

以下是主要的一个:

如果我们可以定义一个类型,它只是Int假设Haskell允许我们这样做的"子集" ,如下:

data IntNotZero = Int {except `0`} -- certainly it is not legal in Haskell, but I just assume that Haskell allows us to define a type as a "subset" of an already existing type. I'm novice of Theory of types, and forgive me.
Run Code Online (Sandbox Code Playgroud)

并且如果函数需要参数Int,则该变量IntNotZero只是其"子集" Int,也可以是函数的参数.但是,如果函数需要a IntNotZero,则a Int是非法的.

例如:

div' :: Int -> IntNotZero -> Int
div' = div

aFunction :: Int -> Int -> Int …
Run Code Online (Sandbox Code Playgroud)

haskell types exception subclass

7
推荐指数
2
解决办法
243
查看次数

我想在Haskell中编写一个类似于`flip`的函数来摆脱lambda表达式.但我不能处理它的类型

我想编写一个Haskell函数,它的作用类似于flip,但更通用,可以使函数的任何参数成为最后一个参数.为方便起见,我们用pull它来代表它.

编写以下代码很容易:

Prelude> :t flip          --we just call this function a swap
flip :: (a -> b -> c) -> b -> a -> c
Prelude> :t (flip.)       --we just call this function a swap
(flip.) :: (a -> a1 -> b -> c) -> a -> b -> a1 -> c
Prelude> :t ((flip.).)    --we just call this function a swap
((flip.).) :: (a -> a1 -> a2 -> b -> c) -> a -> a1 -> …
Run Code Online (Sandbox Code Playgroud)

polymorphism lambda haskell type-systems typeclass

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

获取gdb的python接口中的所有全局变量/局部变量

我通过阅读打印所有全局变量/局部变量一文了解到,我们可以在 gdb 的命令行中获取当前帧的所有变量。

我的问题是如何在 gdb 的 python 接口中获取当前帧的所有变量,因为info locals只以字符串形式给出结果并且不方便进一步使用。

c python debugging gdb

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

如何在递归调用函数时阻止bash创建子shell

这是一个简单的shell函数来计算阶乘.

#!/bin/bash

function factorial()
{
   if (( $1 < 2 ))
   then
     echo 1
   else
     echo $(( $1 * $(factorial $(( $1 - 1 ))) ))
   fi
}

factorial $1
Run Code Online (Sandbox Code Playgroud)

但我发现这个脚本在给出非常大的输入时会创建许多子shell.没有必要也没有效率.有没有办法在不创建新子shell的情况下调用递归函数?

我的目标不是如何在shell中编写阶乘函数,而是在调用递归定义的函数时如何避免创建子shell.

实际上,即使是简单的函数调用也会导致创建子shell:

#!/bin/bash

function fac0() {
  ps >> log
  echo $1
}

function fac1() {
  ps >> log
  echo $(( $1 * $(fac0 $(( $1 - 1 ))) ))
}

touch log
fac1 $1
Run Code Online (Sandbox Code Playgroud)

运行脚本后,log文件的内容为:(它仍会创建子shell)

  PID TTY          TIME CMD
 9205 pts/8    00:00:00 bash
 9245 pts/8    00:00:00 call_subshell.s …
Run Code Online (Sandbox Code Playgroud)

bash shell recursion process

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

为什么包装 FnMut 的 `std::cell::RefMut&lt;'_, [..]&gt;` 没有实现 DerefMut?

我想将一个FnMut闭包包装成RefCell如下所示:

fn borrow_mut_closure() {
    let mut temp = 3i32;
    let cl = RefCell::new(move || {
        temp += 1;
        println!("{}", temp);
    });
    cl.borrow_mut()();
}
Run Code Online (Sandbox Code Playgroud)

但令我惊讶的是,编译器报告:

cannot borrow data in a dereference of `std::cell::RefMut<'_, [closure@src/main.rs:17:25: 20:4 temp:i32]>` as mutable

cannot borrow as mutable

help: trait `DerefMut` is required to modify through a dereference, but it is not implemented for `std::cell::RefMut<'_, [closure@src/main.rs:17:25: 20:4 temp:i32]>`rustc(E0596)
Run Code Online (Sandbox Code Playgroud)

但为什么不实施呢?我怎样才能克服这个问题?

closures mutable rust

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