Haskell函数到Clojure函数的转换

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)

任何帮助表示赞赏。我对这两种语言都是新手。

lee*_*ski 9

据我所见,如果所有元素的长度相等,则此函数返回元素的长度。在这种情况下,它可能看起来像这样:

(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)