4

次のコードは、コンパイル時に警告を表示します。警告:演算子'>'を使用しても効果はありません

rd(a,{x,y}),
List = [#a{x=1,y=2}, #a{x=3,y=4}],
lists:filter(
    fun(E) ->
        E#a.x > 1, E#a.y =:= 2
    end, List).

しかし、カンマをandalsoに置き換えても、警告はありません。

4

2 に答える 2

7

この場合にコンマを使用すると、2つのアクションのみが分離され、相互に影響はありません。E#a.x > 1次の操作(関数の結果)E#a.y =:= 2

これは、あなたの場合、フィルター関数が次のようになることを意味します。

fun( E ) ->
   E#a.y =:= 2
end

ガード式を記述している場合のみ、コンマの使用法はの使用法と同じです。それ以外の場合、コンマはアクション間の区切り文字andalsoにすぎません。

したがって、次の2つの方法で関数を書き直すことができます。

1)

fun
(E) when E#a.x > 1, E#a.y =:= 2 ->
   true;
(_Othervise) ->
   false
end

2)

 fun( E ) ->
    (E#a.x > 1) andalso (E#a.y =:= 2)
 end
于 2012-09-10T07:52:07.543 に答える
1

はい、@stemmが言った通りです。

体内では、,アクションを分離し、評価する順序を与えます。コンパイラはE#a.x > 2、副作用がないため、例外を生成せず、その戻り値が無視され、実行に影響を与えないことを通知しています。

ただし、ガードでは、ガードが成功するためにすべてが成功する必要があるガードテスト,を分離します。

たとえば、ここでのように、ガードを通常の表現として表示する場合は、ガードの動作が異なることに注意してください。ガードは、エラーに対しても異なる動作をします。したがって、警備員は表現のように見えますが、実際にはテストです。

于 2012-09-10T09:58:21.227 に答える