我发现在Python或Common Lisp中你可以在运行时列出库的内容.Haskell有同样的事情,尤其是GHCI提示吗?
如何编写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) 我的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)
这个函数不是尾递归的.有没有办法让我以尾递归的方式编写这个函数?
我相信我对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) 我知道你可以使用'(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)
为什么?我认为'这只是一个方便的速记,为什么行为不同?
好吧,所以我不是Haskell程序员,但我对Haskell背后的许多想法非常感兴趣,并且我正在研究它.但是我被困在第一个方面:我似乎无法绕过Monads,这似乎是相当基础的.我知道有一百万个关于SO的问题要求解释Monads,所以我会更加具体地说明了什么在困扰我:
我读了这篇优秀的文章(Javascript中的介绍),并认为我完全了解Monads.然后我读了Monads上的维基百科条目,看到了:
多态类型(M t)→(t→M u)→(M u)的绑定操作,其中Haskell由中缀运算符表示>> =.它的第一个参数是monadic类型的值,它的第二个参数是一个函数,它从第一个参数的基础类型映射到另一个monadic类型,其结果是在其他monadic类型中.
好的,在我引用的文章中,bind是一个仅占用一个参数的函数.维基百科说两个.我认为我对Monads的理解如下:
但是肯定有一些错误,因为我的bind概念需要一个参数:一个函数.但是(根据维基百科)Haskell的绑定实际上有两个参数!我的错误在哪里?
我正在阅读有关列表操作的一些技巧,其中包含以下内容:
Run Code Online (Sandbox Code Playgroud)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)
我不明白您如何“取消”堆叠的延续以从顶部的代码块到达底部的代码块。您寻找进行这种转换的方式是什么,为什么会起作用?
我正在阅读Reasoned Schemer.
我对如何conde运作有一些直觉.
但是,我找不到conde/ conda/ condu/ condi做什么的正式定义.
我知道https://www.cs.indiana.edu/~webyrd/但似乎有例子而不是定义.
有没有一个正式的定义conde,conda,condi,condu地方?
在我正在阅读的代码库中,我发现了一个像这样的函数声明(缺少某些部分):
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编程中提到的这个语法是从第一原则开始的,如果是这样的话,在哪里?我记不起来了解它.)
我正在运行Windows 2003 Service Pack 2.我有一个按需运行的批处理文件.我希望每次批处理文件运行时都会发送一封电子邮件.电子邮件很简单,只是一个表示批处理文件运行的句子; 每次都是一样的.
我已经尝试了几件事来完成这件事.我想到了telnet,但我无法弄清楚如何将一组命令重定向到telnet; Windows批处理文件没有Unix风格的"here here",并且调用scriptfile包含发送电子邮件的命令的"telnet <scriptfile"地方不起作用.我还使用CDO.Message在互联网上找到了几个解决方案,但我以前从未使用过,我不断收到我不理解的错误消息.
如何从Windows批处理文件发送简单的电子邮件?
haskell ×5
scheme ×2
batch-file ×1
binary-tree ×1
clojure ×1
composition ×1
currying ×1
email ×1
evaluation ×1
fold ×1
guard-clause ×1
map-function ×1
minikanren ×1
monads ×1
ocaml ×1
pointfree ×1
prolog ×1
quote ×1
racket ×1
syntax ×1
tree ×1
windows ×1