试图将Haskell函数转换为Clojure。但是面临困难。不知道发生了什么。
这是递归的Haskell函数。
mapWidth :: [[Char]] -> Int mapWidth [] = 0 mapWidth (x:xs) | length xs == 0 = length x | length x /= length (xs!!0) = -1 | otherwise = mapWidth(xs)
到目前为止,这是我尝试过的:
(defn mapWidth [data_list] (def data 0) ([[x & xs](seq data_list)](if (= (count x) 0) (data 0) (data -1)))) ([[x & xs](seq data_list)](if not(= (count xs) length (xs!!0)) (data 0) (data -1) mapWidth(xs)))
任何帮助表示赞赏。我对这两种语言都是新手。
据我所见,如果所有元素的长度相等,则此函数返回元素的长度。在这种情况下,它可能看起来像这样:
(defn map-len [[x & [y :as xs]]] (cond (empty? xs) (count x) (not= (count x) (count y)) -1 :else (recur xs)))
这几乎是haskell变体的确切重写(用代替直接递归调用recur
)
(map-len [[1 2] [3 4] [5 6]]) ;;=> 2 (map-len [[1 2] [3 4 5] [5 6]]) ;;=> -1
机器人,因为clojure是关于序列的操作,因此您可以采用一种更加惯用的方式来完成(就我而言):
(defn map-len2 [data] (cond (empty? data) 0 (apply = (map count data)) (count (first data)) :else -1)) (defn map-len3 [[x & xs]] (let [c (count x)] (if (every? #(= c (count %)) xs) c -1)))