あなたが投稿した例では、関数の両方の定義に同じ数の引数があります:2、この「時」はガードですが、多くの引数を持つ定義を持つこともできます。まず、警備員 - 彼らは、次の2行目のように、単なるマッチングのように書くことができないものを表現するために使用されている: - それはちょうど平等/マッチングでいる負の数を表現することはできませんので、
def fac(0), do: 1
def fac(n), when n<0 do: "no factorial for negative numbers!"
def fac(n), do: n*fac(n-1)
。
btwこのファシリティは、3つのケースでのみ定義されています。さえにかなり近い見えます
def fac(n) do
if n==0, do: 1, else: if n<0, do: "no factorial!", else: n*fac(n-1)
end
またはスイッチケース(:あなたはそれがよりよい書き込むための方法だろうと考えることができ、引数:) の位置にある定数「0」を使用しての涼しさに注目してください上記):
def fa(n) do
case n do
0 -> 1
n when n>0 -> n*fa(n-1)
_ -> "no no no"
end
end
「もっと見栄えが良い」実際には、後者のスタイルよりもはるかに良く見える特定の定義(パーサ、小さな通訳など)が判明しています。 Nbガードの表現は非常に限られています(あなた自身の関数をガードに使うことはできません)。
実際のところ、さまざまな議論があります - これをチェックしてください!
def mutant(a), do: a*a
def mutant(a,b), do: a*b
def mutant(a,b,c), do: mutant(a,b)+mutant(c)
iex(1)> Lol.mutant(2)
4
iex(2)> Lol.mutant(2,3)
6
iex(3)> Lol.mutant(2,3,4)
22
それはスキーム中(ラムダ引数...)のような類似したビットで動作します - それ以上のリストと一致するように、すべての引数を取るよう変異を考えます。しかし今回、エリキシルは突然変異体を3つの機能、すなわち突然変異体/ 1,突然変異体/ 2および突然変異体/ 3として扱い、これらを参照する。
あなたの質問に答えてください:これらはオーバーロードされた関数ではなく、散在した/断片化された定義です。あなたはmiranda、haskell、smlのような関数型言語で同様のものを参照してください。
これは本当に*パターンマッチング*とガード句です。 'when'ガード節の評価を含む、引数に最も適合する*関数の実装*が選択されます。これは同じ機能ですが、複数の実装しかありません。 – deceze
あなたの関数は異なる署名を持っていますが、大丈夫ですが、署名が同じであれば別のアクセス(defまたはdefp)は許されません。 – PatNowak