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

我正在复习haskell的讲座,我不认识任何haskell,但我对这个问题很感兴趣,我正在尝试将他的代码移植到clojure

这是我被卡住的部分一定是我在haskell里找不到的


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