3

Haskell について私が魅力的だと思うことの 1 つは、関数と変数がどのように同じであるかということです。ほとんどの言語では、関数が何かを実行している間、変数は値を保持し、最終的に値を返します。Haskell ではこの違いは見られず、Haskell を使用した後、変数が関数やメソッドとは異なる、より「伝統的な」プログラミングに戻るのはぎこちなく感じます。値を取得したい場合、それが定数値であるか、変更可能な変数であるか、複雑な計算の結果であるかに関係なく、その元を気にする必要はありません。Haskell では、変数は単なる 0-ary 関数です。

多くのオブジェクト指向言語には、少しギャップを感じさせるプロパティがあります。

Haskell に似たシステムを持つ他の言語を示すことができる人はいますか? 参照透過性のために関数型言語に共通していると思っていましたが、そうではないことがわかりました。たとえば Lisp では、(defun)関数を明示的に宣言する必要があります。

4

3 に答える 3

4

Haskell に似たシステムを持つ他の言語を示すことができる人はいますか?

いくつかの言語には、デフォルトで不変変数(つまり、数学的な意味での変数) があります。

  • Haskell(明らかに)、
  • 掃除、
  • アーラン、
  • ML。

'const' または 'val' 宣言 (Scala、C) を介してこの動作を奨励するものもあります。

多くの関数型言語では、変更可能な値は、明示的な 'ref' または 'var' 宣言によってのみ導入できます。

于 2011-04-13T20:25:03.877 に答える
1

Clojure では、defn は def に対する単なるマクロです。Var は不変であり、値を保持します。関数は、他の種類の値と同様に単なる値です。値が実際に関数(Fn) であるかどうかは、そのタイプの値が関数インターフェイス (IFn)を実装しているかどうかと同様に重要ではありません。

最後の点を明確にするために、Java プリミティブ配列は関数ではありません。それを Clojure シーケンスとして扱いたいと思うかもしれません。プリミティブ配列を介してそのインターフェイス (ISeq) を提示できるようにするラッパー型を作成できます。ラッパー型に IFn を実装させることもでき、プリミティブ配列も関数として扱うことができます。

(def x (wrap-prim-array ...))

(nth x 0) ; idiomatic random access
(x 0)     ; used as a function
于 2011-04-13T21:17:33.193 に答える
-6

Javascriptを忘れないでください。

var a = function(x) { return (x + 1) };
var b = a(1);
// b == 2 here.

完全に合法です。

于 2011-04-14T05:08:28.983 に答える