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