1

私は周りを見回していて、これの例を見つけることができず、私の構文レスリングスキルのすべてが私を失敗させています。誰かがこれをコンパイルする方法を教えてもらえますか?私の、s;sまたは.sはちょうど間違っています私は入れ子関数を定義するために推測します...

文字列の置換を行う関数がすでにあることを知っているので、これを実装する必要はありませんが、Erlangでそれを取得しようとしているので、使用する必要のある基本のいくつかを手で回転させています。 。

replace(Whole,Old,New) ->
    OldLen = length(Old),
    ReplaceInit = fun(Next, NewWhole) ->
              if
                  lists:prefix(Old, [Next|NewWhole]) -> {_,Rest} = lists:split(OldLen-1, NewWhole), New ++ Rest;
                  true -> [Next|NewWhole]
              end,
    lists:foldr(ReplaceInit, [], Whole).

基本的に私はこのhaskellを書き込もうとしています(おそらく悪いですが、要点を超えています):

repl xs ys zs =
  foldr replaceInit [] xs
  where
    ylen = length ys
    replaceInit y newxs
      | take ylen (y:newxs) == ys = zs ++ drop (ylen-1) newxs
      | otherwise = y:newxs
4

1 に答える 1

6

主な問題は、あなたがテストとしてガードifを使用することだけが許可されているということです。ガードは非常に制限されており、とりわけ、一般的なErlang関数の呼び出しは許可されていません。それらがOTPリリースの一部であるか、あなたが作成したものであるかに関係なく。関数の最善の解決策は、の代わりにを使用することです。例えば:caseif

replace(Whole,Old,New) ->
    OldLen = length(Old),
    ReplaceInit = fun (Next, NewWhole) ->
                      case lists:prefix(Old, [Next|NewWhole]) of
                          true ->
                              {_,Rest} = lists:split(OldLen-1, NewWhole),
                              New ++ Rest;
                          false -> [Next|NewWhole]
                      end
                  end,
    lists:foldr(ReplaceInit, [], Whole).

このためif、Erlangではそれほど頻繁には使用されません。Erlangのドキュメントでガードについてifとについてを参照してください。

于 2012-11-13T21:09:51.990 に答える