小编Wil*_*ess的帖子

有没有办法在GHCI中查看模块中的功能列表?

我发现在Python或Common Lisp中你可以在运行时列出库的内容.Haskell有同样的事情,尤其是GHCI提示吗?

haskell

35
推荐指数
2
解决办法
5622
查看次数

将谓词应用于列表元素的Prolog映射过程

如何编写map(List, PredName, Result)将谓词应用于PredName(Arg, Res)元素的Prolog过程,并将List结果返回到列表中Result

例如:

test(N,R) :- R is N*N.

?- map([3,5,-2], test, L).
L = [9,25,4] ;
no
Run Code Online (Sandbox Code Playgroud)

prolog meta-predicate map-function

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

尾递归函数,用于在Ocaml中查找树的深度

我的tree定义类型如下

type 'a tree = Leaf of 'a | Node of 'a * 'a tree * 'a tree ;;
Run Code Online (Sandbox Code Playgroud)

我有一个函数来查找树的深度如下

let rec depth = function 
    | Leaf x -> 0
    | Node(_,left,right) -> 1 + (max (depth left) (depth right))
;;
Run Code Online (Sandbox Code Playgroud)

这个函数不是尾递归的.有没有办法让我以尾递归的方式编写这个函数?

tree binary-tree ocaml functional-programming

33
推荐指数
2
解决办法
6694
查看次数

我怎么能理解"(.).(.)"?

我相信我对fmap . fmapFunctors 了解,但是在功能方面它已经让我头疼了好几个月了.

我已经看到你可以只应用(.)to 的定义(.) . (.),但我忘了怎么做.
当我自己尝试时,它总是错误的:

(.) f g = \x -> f (g x)
(.) (.) (.) = \x -> (.) ((.) x)
\x f -> (.) ((.) x) f
\x f y  -> (((.)(f y)) x)
\x f y g-> (((.)(f y) g) x)
\x f y g-> ((f (g y)) x)
\x f y g-> ((f (g y)) x):: t2 -> (t1 -> t2 -> t) -> t3 …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming pointfree

33
推荐指数
3
解决办法
2141
查看次数

引号和列表有什么区别?

我知道你可以使用'(aka quote)创建一个列表,我一直都在使用它,如下所示:

> (car '(1 2 3))
1
Run Code Online (Sandbox Code Playgroud)

但它并不总是像我期望的那样工作.例如,我试图创建一个函数列表,像这样,但它不起作用:

> (define math-fns '(+ - * /))
> (map (lambda (fn) (fn 1)) math-fns)
application: not a procedure;
  expected a procedure that can be applied to arguments
  given: '+
Run Code Online (Sandbox Code Playgroud)

当我使用时list,它的工作原理:

> (define math-fns (list + - * /))
> (map (lambda (fn) (fn 1)) math-fns)
'(1 -1 1 1)
Run Code Online (Sandbox Code Playgroud)

为什么?我认为'这只是一个方便的速记,为什么行为不同?

evaluation scheme racket quote

33
推荐指数
2
解决办法
8009
查看次数

Haskell Monad绑定运算符混淆

好吧,所以我不是Haskell程序员,但我对Haskell背后的许多想法非常感兴趣,并且我正在研究它.但是我被困在第一个方面:我似乎无法绕过Monads,这似乎是相当基础的.我知道有一百万个关于SO的问题要求解释Monads,所以我会更加具体地说明了什么在困扰我:

我读了这篇优秀的文章(Javascript中的介绍),并认为我完全了解Monads.然后我读了Monads上的维基百科条目,看到了:

多态类型(M t)→(t→M u)→(M u)的绑定操作,其中Haskell由中缀运算符表示>> =.它的第一个参数是monadic类型的值,它的第二个参数是一个函数,它从第一个参数的基础类型映射到另一个monadic类型,其结果是在其他monadic类型中.

好的,在我引用的文章中,bind是一个仅占用一个参数的函数.维基百科说两个.我认为我对Monads的理解如下:

  1. Monad的目的是使用具有不同输入和输出类型的函数并使其可组合.它通过使用单个monadic类型包装输入和输出类型来实现此目的.
  2. Monad由两个相互关联的函数组成:bind和unit.绑定采用不可组合的函数f并返回一个新函数g,它接受monadic类型作为输入并返回monadic类型.g是可组合的.unit函数接受f期望的类型的参数,并将其包装在monadic类型中.然后可以将其传递给g,或者传递给g之类的任何函数组合.

但是肯定有一些错误,因为我的bind概念需要一个参数:一个函数.但是(根据维基百科)Haskell的绑定实际上有两个参数!我的错误在哪里?

monads haskell currying composition function-composition

32
推荐指数
3
解决办法
1万
查看次数

两个延续如何相互抵消?

我正在阅读有关列表操作的一些技巧,其中包含以下内容:

zipRev xs ys = foldr f id xs snd (ys,[])
  where
    f x k c = k (\((y:ys),r) -> c (ys,(x,y):r)) 
Run Code Online (Sandbox Code Playgroud)

我们在这里可以看到,我们有两个连续的叠放在一起。发生这种情况时,他们通常可以“取消”,如下所示:

zipRev xs ys = snd (foldr f (ys,[]) xs)
  where
    f x (y:ys,r) = (ys,(x,y):r)
Run Code Online (Sandbox Code Playgroud)

我不明白您如何“取消”堆叠的延续以从顶部的代码块到达底部的代码块。您寻找进行这种转换的方式是什么,为什么会起作用?

continuations haskell fold continuation-passing

31
推荐指数
2
解决办法
1429
查看次数

conda,condi,conde,condu

我正在阅读Reasoned Schemer.

我对如何conde运作有一些直觉.

但是,我找不到conde/ conda/ condu/ condi做什么的正式定义.

我知道https://www.cs.indiana.edu/~webyrd/但似乎有例子而不是定义.

有没有一个正式的定义conde,conda,condi,condu地方?

scheme clojure minikanren clojure-core.logic

30
推荐指数
2
解决办法
2653
查看次数

守护语法中的逗号有什么作用?

在我正在阅读的代码库中,我发现了一个像这样的函数声明(缺少某些部分):

filepathNormalise :: BS.ByteString -> BS.ByteString
filepathNormalise xs
    | isWindows, Just (a,xs) <- BS.uncons xs, sep a, Just (b,_) <- BS.uncons xs, sep b
    = '/' `BS.cons` f xs
Run Code Online (Sandbox Code Playgroud)

逗号在这里做什么?

(只有作为奖励,如果有人知道这一点:Haskell编程中提到的这个语法是从第一原则开始的,如果是这样的话,在哪里?我记不起来了解它.)

syntax haskell guard-clause pattern-guards

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

如何从Windows批处理文件发送简单的电子邮件?

我正在运行Windows 2003 Service Pack 2.我有一个按需运行的批处理文件.我希望每次批处理文件运行时都会发送一封电子邮件.电子邮件很简单,只是一个表示批处理文件运行的句子; 每次都是一样的.

我已经尝试了几件事来完成这件事.我想到了telnet,但我无法弄清楚如何将一组命令重定向到telnet; Windows批处理文件没有Unix风格的"here here",并且调用scriptfile包含发送电子邮件的命令的"telnet <scriptfile"地方不起作用.我还使用CDO.Message在互联网上找到了几个解决方案,但我以前从未使用过,我不断收到我不理解的错误消息.

如何从Windows批处理文件发送简单的电子邮件?

windows email batch-file

29
推荐指数
3
解决办法
25万
查看次数