Haskell 哈斯凯尔到克罗朱尔
我正在复习haskell的讲座,我不认识任何haskell,但我对这个问题很感兴趣,我正在尝试将他的代码移植到clojure 这是我被卡住的部分一定是我在haskell里找不到的Haskell 哈斯凯尔到克罗朱尔,haskell,clojure,Haskell,Clojure,我正在复习haskell的讲座,我不认识任何haskell,但我对这个问题很感兴趣,我正在尝试将他的代码移植到clojure 这是我被卡住的部分一定是我在haskell里找不到的 split :: [a] -> [([a],[a])] split [] = [([],[])] split (x:xs) = ([],x:xs) : [(x:ls,rs) | (ls,rs) [([a],[a])] nesplit
split :: [a] -> [([a],[a])]
split [] = [([],[])]
split (x:xs) = ([],x:xs) : [(x:ls,rs) | (ls,rs) [([a],[a])]
nesplit = filter ne . split
ne :: ([a],[b]) -> Bool
ne (xs,ys) = not (null xs || null ys)
exprs :: [Int] -> [Expr]
exprs [] = []
exprs [n] = [Val n]
exprs ns = [e | (ls,rs)
这给了我
java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Integer
java.lang.IllegalArgumentException:不知道如何从以下内容创建ISeq:java.lang.Integer
谁能告诉我haskell代码中遗漏了什么
他的完整代码清单已经提供。这是紧跟Haskell实现的,因为我有限的Haskell fu允许我这么做
(defn split
[s]
(map #(split-at % s) (range 1 (count s))))
(defn ne
[s]
(every? (complement empty?) s))
(defn nesplit
[s]
(filter ne (split s)))
(declare combine)
(defn exprs
[s]
(when-let [s (seq s)]
(if (next s)
(for [[ls rs] (nesplit s)
l (exprs ls)
r (exprs rs)
e (combine l r)]
e)
s)))
但我还没有测试过
至于您的错误消息:我认为问题在于,您没有在exprs
中递归调用split
。然后你会得到1
一个预期的序列
随机其他注释:
count
在时间上对序列是线性的。因为我们只需要知道是否有多个元素,我们可以对照nil
检查(下一个s)
的值。异常结果是递归调用expr,并最终使用整数列表调用expr。您的代码只处理列表列表或长度为1的列表
(exprs '(2 3 4))
导致if语句的else分支,该分支扩展为:
(map #(concat (exprs (first %)) (exprs (second %))) '(2 3 4))))
结果是:
(concat (exprs (first 2)) (exprs (second 2)))
(concat (exprs (first 3)) (exprs (second 3)))
(concat (exprs (first 4)) (exprs (second 4)))
和(前2)投掷:
Haskell代码的最后一行是否缺少右方括号?我在这里也看到了同样的问题,尽管比Graham Hutton优雅的解决方案更像蛮力。看,非常感谢杰夫,我一直在尝试蛮力方法。
(map #(concat (exprs (first %)) (exprs (second %))) '(2 3 4))))
(concat (exprs (first 2)) (exprs (second 2)))
(concat (exprs (first 3)) (exprs (second 3)))
(concat (exprs (first 4)) (exprs (second 4)))
java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Integer