2015-09-27 10 views
5

का उपयोग कर मैं सिर्फ Erlang सीखने शुरू कर दिया है, लेकिन मैं समझ नहीं क्यों इस कोड समारोह कॉल परीक्षण से मेल नहीं खाता बनाम: राशि (3)गार्ड भाव: का उपयोग कर "और" "अल्पविराम"

-module(test). 
-export([sum/1]). 

sum(0) -> 0; 
sum(N) when is_integer(N) and N>0 -> N + sum(N - 1). 

... जबकि इस करता है:

-module(test). 
-export([sum/1]). 

sum(0) -> 0; 
sum(N) when is_integer(N), N>0 -> N + sum(N - 1). 

Am मैं दो अलग अलग तरीकों के बारे में कुछ कमी?

उत्तर

6

यह ऑपरेटर प्राथमिकता के कारण हो रहा है।

के रूप में परिभाषित किया गया reference, ऑपरेटर and आता > से पहले, तो क्या आप वास्तव में अपने पहले कोड स्निपेट में मिलता है:

sum(N) when (is_integer(N) and N)>0 -> N + sum(N - 1). 
अपने मामले में

तो तुम (true and 3) > 0 तुलना कर रहे हैं, जो सच नहीं हो सकता , यही कारण है कि आपका गार्ड कभी मेल नहीं खाता है।

इसे ठीक करने के आप अपने गार्ड इस तरह से लिख सकते हैं:

sum(N) when (is_integer(N)) and (N>0) -> N + sum(N - 1). 

पी.एस. इस परिदृश्य में is_integer/1 के लिए अभिभावक आवश्यक नहीं हैं, लेकिन यह इस तरह से स्पष्ट दिख सकता है।

+0

बीटीडब्ल्यू, is_integer (एन) ब्रैकेट्स –

+0

में नहीं ले सकता है, इसके अलावा, 'और' curcuit (जैसा '' 'करता है) छोटा नहीं है, इसलिए इसके बजाय 'Andalso' को प्राथमिकता दी जानी चाहिए। –

संबंधित मुद्दे