Haskell 函数到 Clojure 函数的转换

Haskell Function to Clojure function conversion

正在尝试将 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)))

感谢任何帮助。我对这两种语言都很陌生。

据我所知,此函数 returns 一个元素的长度,如果所有元素的长度都相等。在这种情况下,它可能看起来像这样:

(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

bot 因为 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)))