この関数がnilを返すのはなぜですか?

接着剤virgilio

私はClojureと関数型プログラミングを勉強しています。練習するために、4clojureの問題に取り組んでいます。

この機能(最善のアプローチではありません。私は知っています)は機能しています。(逆インターリーブ)ただし、関数はnilを再調整しています。

(defn reverse_interleave
  [coll ss]
  (let [xx (dec ss)]
    (loop [coll (reverse coll) s xx _ss ss ret `()]
      (if (nil? (first coll)) (do (println :ret ret) ret))
      (when-let [x (first coll)]
                        (recur 
                          (rest coll)
                          (if (zero? s) xx (dec s))
                          (if (or (= 1 _ss) (zero? _ss)) 0 (dec _ss))
                          (if (zero? _ss)
                            (map-indexed #(if (= % s) (cons x %2) %2) ret)
                            (cons (list x) ret))
                            ))
      )) ret)


(reverse_interleave (range 9) 3)

問題は...なぜですか?

マジシャン

ここで重要なのは、Clojureはほとんどの命令型言語のようなステートメントを実際には実行しないということですdo、それが可能である副作用のために複数の式を評価して、最後のものの値を返す、などいくつかの構築物letおよびfn暗黙的に含まれていますdoただし、例外をスローしない限り、最後の式以外の式で評価を停止して「完了しました」と言うことはできません。そのため、ライン全体

(if (nil? (first coll)) (do (println :ret ret) ret))

その副作用によってのみ見ることができます。の値retまたはとして評価され、nil破棄されます。

次に、を開きますwhen-letこれはのバリアントであるためwhen、条件が満たされている場合は本体の値を返すか、満たされていない場合は本体の値を返しますnil本文はrecurループの先頭への命令であるため、このループは値でのみ終了できますnil
自然な修正は、ifフォームの最後の親を取得し、その後に移動when-letして、フォーム全体がelse-caseの値になるようにすることです。コードは、それretを作成するループの外側で名前を使用しているため、そのままではコンパイルに失敗しますが、それがなくなると、意図したとおりに機能するようです。

(defn reverse_interleave
  [coll ss]
  (let [xx (dec ss)]
    (loop [coll (reverse coll) s xx _ss ss ret `()]
      (if (nil? (first coll)) 
        (do (println :ret ret) ret)
        (when-let [x (first coll)]
          (recur 
           (rest coll)
           (if (zero? s) xx (dec s))
           (if (or (= 1 _ss) (zero? _ss)) 0 (dec _ss))
           (if (zero? _ss)
             (map-indexed #(if (= % s) (cons x %2) %2) ret)
             (cons (list x) ret))))))))

(reverse_interleave (range 9) 3)
;;returns ((0 3 6) (1 4 7) (2 5 8))

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

この関数がNaNを返すのはなぜですか?

分類Dev

この関数が0を返すのはなぜですか

分類Dev

この関数がnullを返すのはなぜですか?

分類Dev

この関数が-3を返すのはなぜですか?

分類Dev

tableView変数がnilを返すのはなぜですか?

分類Dev

この関数が整数級数を返すのはなぜですか?

分類Dev

この関数が異なる値を返すのはなぜですか?

分類Dev

この関数が「なし」を返すのはなぜですか?

分類Dev

この関数が空の配列を返すのはなぜですか?

分類Dev

このandroid関数が常にfalseを返すのはなぜですか?

分類Dev

この再帰関数が未定義を返すのはなぜですか?

分類Dev

この定義が関数を返すのはなぜですか?

分類Dev

この非同期関数が未定義を返すのはなぜですか?

分類Dev

このJavaScript関数が「2」を返すのはなぜですか?

分類Dev

この関数が常にゼロを返すのはなぜですか?

分類Dev

このPython関数がUnboundLocalErrorを返すのはなぜですか?

分類Dev

この関数がゼロを返すのはなぜですか?

分類Dev

この関数が未定義を返すのはなぜですか?

分類Dev

このモード関数が null を返すのはなぜですか?

分類Dev

このjavascript関数が未定義を返すのはなぜですか?

分類Dev

この関数が値を返さないのはなぜですか?

分類Dev

このクエリがFirestoreからnilを返すのはなぜですか

分類Dev

Nil :: NilがList(List())を返すのはなぜですか?

分類Dev

falseを返す必要があるのに、この関数がtrueを返すのはなぜですか?

分類Dev

このべき関数が負の指数関数の場合にゼロを返すのはなぜですか?

分類Dev

main関数が負の数を返すことができないのはなぜですか?

分類Dev

このJava関数で2の31乗が負の数を返すのはなぜですか?

分類Dev

再帰関数がNoneを返すのはなぜですか?

分類Dev

print関数がNoneを返すのはなぜですか?

Related 関連記事

  1. 1

    この関数がNaNを返すのはなぜですか?

  2. 2

    この関数が0を返すのはなぜですか

  3. 3

    この関数がnullを返すのはなぜですか?

  4. 4

    この関数が-3を返すのはなぜですか?

  5. 5

    tableView変数がnilを返すのはなぜですか?

  6. 6

    この関数が整数級数を返すのはなぜですか?

  7. 7

    この関数が異なる値を返すのはなぜですか?

  8. 8

    この関数が「なし」を返すのはなぜですか?

  9. 9

    この関数が空の配列を返すのはなぜですか?

  10. 10

    このandroid関数が常にfalseを返すのはなぜですか?

  11. 11

    この再帰関数が未定義を返すのはなぜですか?

  12. 12

    この定義が関数を返すのはなぜですか?

  13. 13

    この非同期関数が未定義を返すのはなぜですか?

  14. 14

    このJavaScript関数が「2」を返すのはなぜですか?

  15. 15

    この関数が常にゼロを返すのはなぜですか?

  16. 16

    このPython関数がUnboundLocalErrorを返すのはなぜですか?

  17. 17

    この関数がゼロを返すのはなぜですか?

  18. 18

    この関数が未定義を返すのはなぜですか?

  19. 19

    このモード関数が null を返すのはなぜですか?

  20. 20

    このjavascript関数が未定義を返すのはなぜですか?

  21. 21

    この関数が値を返さないのはなぜですか?

  22. 22

    このクエリがFirestoreからnilを返すのはなぜですか

  23. 23

    Nil :: NilがList(List())を返すのはなぜですか?

  24. 24

    falseを返す必要があるのに、この関数がtrueを返すのはなぜですか?

  25. 25

    このべき関数が負の指数関数の場合にゼロを返すのはなぜですか?

  26. 26

    main関数が負の数を返すことができないのはなぜですか?

  27. 27

    このJava関数で2の31乗が負の数を返すのはなぜですか?

  28. 28

    再帰関数がNoneを返すのはなぜですか?

  29. 29

    print関数がNoneを返すのはなぜですか?

ホットタグ

アーカイブ