Ara*_*ind 0 haskell clojure code-translation
试图将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)
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我尝试过的:
(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)))
Run Code Online (Sandbox Code Playgroud)
任何帮助表示赞赏。我对这两种语言都是新手。
据我所见,如果所有元素的长度相等,则此函数返回元素的长度。在这种情况下,它可能看起来像这样:
(defn map-len [[x & [y :as xs]]]
(cond (empty? xs) (count x)
(not= (count x) (count y)) -1
:else (recur xs)))
Run Code Online (Sandbox Code Playgroud)
这几乎是haskell变体的确切重写(用代替直接递归调用recur)
(map-len [[1 2] [3 4] [5 6]])
;;=> 2
(map-len [[1 2] [3 4 5] [5 6]])
;;=> -1
Run Code Online (Sandbox Code Playgroud)
机器人,因为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)))
Run Code Online (Sandbox Code Playgroud)