質問: **PHP 7.1 以降で、(ユーザ定義)関数へ渡す引数が少ない場合エラーになることを知り驚きました** --- **Q1.他のプログラミング言語では、関数に渡す引数が少ない場合、一般的にはどういう挙動になるのでしょうか?** ・これに関して、実装の流行りとかそういうのはあるのでしょうか? **Q2.「言語に組み込みの関数」と「ユーザ定義関数」の挙動は一般的には異なるのでしょうか?** --- **質問背景** ・「関数へ渡す引数が少ないことを認めない言語」の方が多い、もしくはそれが普通かどうか、知りたいと思ったので
回答: 話題に出ていない言語かつ少ない引数を受け取れるものだけをピックアップしました。 Haskellでは、引数が少ないと渡されたところだけ部分適用された関数を返します。 ``` add a b = a + b x = add 1 -- 引数を一つ取る関数が返る y = x 2 -- 3が返る main = print y -- 3を表示 ``` 全てがカリー化されている他の言語や、カリー化している関数はすべてこのような動作になるでしょう。 Rubyでは、通常のメソッドは引数の数が合わないとエラーですが、Procはあわなくてもnilが補充して渡されてエラーになりません。しかし、似たような形のラムダ式はエラーになります。 ``` # nilを+するとエラーになるため、エラーにならないようにしています。 def add(a, b) a.to_i + b.to_i end add_p = proc { |a, b| a.to_i + b.to_i } add_l = -> (a, b) { a.to_i + b.to_i } add(0) # ArgumentError 引数の数が合わないのでエラー add_p.call(0) # 0, nil がわたされ、0が返る add_l.call(0) # ArgumentError 引数の数が合わないのでエラー ```