【问题标题】:Haskell Function to Clojure function conversionHaskell 函数到 Clojure 函数的转换
【发布时间】:2019-10-14 16:38:08
【问题描述】:

试图将 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)))

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

【问题讨论】:

  • -1 在这里返回是一个奇怪的值。在 Haskell 中,这个函数不应该是 [[Char]] -> Maybe Int 吗?在 Clojure 中,您将返回 nil

标签: haskell clojure code-translation


【解决方案1】:

据我所知,如果所有元素的长度相等,则此函数返回元素的长度。在这种情况下,它可能如下所示:

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

【讨论】:

    猜你喜欢
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多