当前位置:  开发笔记 > 人工智能 > 正文

Haskell函数到Clojure函数的转换

如何解决《Haskell函数到Clojure函数的转换》经验,为你挑选了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)))

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



1> leetwinski..:

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

(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

机器人,因为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)))

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有