簡體   English   中英

如果列入清單,那就是利弊

[英]cons erlang if stament into list

我們可以在以下結構中以與Haskell類似的方式使用if語句嗎?

replace_with :: (a -> Bool) -> [a] -> a -> [a]
replace_with _ [] _ = []
replace_with f (x:xs) y = (if f x then y else x) : replace_with f xs y

我嘗試過以下方法:

rwith(_,[],_) ->
    [];
rwith(F,[X|XS],Y) ->
    [if F(X) == true -> Y; true -> X, end. | replace_with(F,XS,Y)].

但是我得到了編譯響應:

listsh.erl:40: syntax error before: 'end'
listsh.erl:40: syntax error before: '|'

我使用了以下哪個工作正常,但我有興趣知道是否有可能返回if語句?

replace_with(_,[],_) ->
    [];
replace_with(F,[X|XS],Y) ->
    case F(X) of
        true -> [Y|replace_with(F,XS,Y)];
        false -> [X|replace_with(F,XS,Y)]
    end.

正確的代碼應該是:

[if F(X) =:= true -> Y; true -> X end | replace_with(F,XS,Y)].

(在=:= Erlang中使用=:=更方便但在這里並不重要)但if語句中只能有guard表達式所以你必須使用

T = F(X),
[if T =:= true -> Y; true -> X end | replace_with(F,XS,Y)].

或更多慣用語

[case F(X) of true -> Y; false -> X end | replace_with(F,XS,Y)].

您甚至可以用。替換整個功能

[ case F(X) of true -> Y; false -> X end || X <- XS ].

注意這里二郎語法,是表達式的分隔符; 是條款的分隔符, . 結束函數定義, end復合表達式。 對於來自其他語言的人來說可能不方便。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM