関数型プログラミング言語であるschemeには、代入文がありません。しかしlet
声明では
(let ((x 2))
(+ x 3))
に代入2
していますx
が、関数型プログラミングには代入文がないという原則に違反しないのはなぜですか?
関数型プログラミング言語であるschemeには、代入文がありません。しかしlet
声明では
(let ((x 2))
(+ x 3))
に代入2
していますx
が、関数型プログラミングには代入文がないという原則に違反しないのはなぜですか?
「関数型プログラミング言語であるスキーム」という記述は正しくありません。Scheme では、関数型プログラミング スタイルが推奨されていますが、強制されているわけではありません。実際、set!
任意の変数の値を変更するために (代入ステートメント!) を使用できます。
(define x 10)
(set! x (+ x 3))
x
=> 13
質問の文については、let
次のような表現を思い出してください。
(let ((x 10))
(+ x 3))
=> 13
... これは単なる構文糖衣であり、内部では次のように実装されています。
((lambda (x)
(+ x 3))
10)
=> 13
aはその変数let
に対して 1 回限りの単一の代入を実行するため、純粋関数型プログラミングの原則自体に違反していないことに注意してください。次のlet
式を確認できます。
式の評価は、マシンの観測可能な状態を変更せず、同じ入力に対して同じ値を生成する場合、副作用はありません
また、ウィキペディアからの引用:
非純粋な関数型言語は、単一の代入と真の代入の両方を提供します (ただし、真の代入は通常、命令型プログラミング言語よりも少ない頻度で使用されます)。たとえば、Scheme では、単一の代入 ( を使用
let
) と真の代入 ( をset!
使用) の両方をすべての変数で使用でき、リスト、ベクトル、文字列などの内部で破壊的な更新を行うための特殊なプリミティブが提供されます。
http://en.wikipedia.org/wiki/Assignment_(computer_science)#Single_assignment
基本的には、許容される単一の割り当てです。副作用のため、他の割り当ては「許可」されていません。
編集:オスカーが述べたように、それは必須ではなく提案されているため、引用で許可されています.