内部の foldl 呼び出し内で x の値をインクリメントしようとしているときに問題が発生しました。x を渡された shiftValue と等しくし、内側の foldl 呼び出しで #" " または #"*" を見つけるたびにそれをインクリメントしようとしますが、返される x の値は渡されたときの shiftvalue と常に同じです。 .
この関数は (string, int) のタプルを受け取ります。文字列の先頭のスペースと切り捨てられたアスタリスクは、他の文字の前に置かれます。また、末尾に他の文字が続かないスペースやアスタリスクも切り捨てられます。渡される int は、この関数に渡される前に文字列がシフトされたスペースの数を追跡する shiftValue です。先頭のスペースまたはアスタリスクを外すたびに、shiftValue "x" を 1 ずつインクリメントする必要があります。
内側の foldl 呼び出しは、先頭からアスタリスクとスペースを削除します。外側の foldl 呼び出しは、それらを背面から削除します。アスタリスクとスペースは正しく削除され、x 値は更新されません。
(*Take string str and get rid of leading and following #"*"s and #" "s. For every
leading #"*" or #" " removed increment the shiftValue returned in the tuple*)
fun trimStarsOnNode (str, shiftValue) =
let
val x = shiftValue
in
((implode(rev (foldl (fn (cur, a) =>
if length a = 0 andalso cur = #"*" then a @ []
else
if length a = 0 andalso cur = #" " then a @ []
else a @ [cur]) [] (rev (foldl (fn (cur, a) =>
if length a = 0 andalso cur = #"*" then (x = x + 1; a @ [])
else
if length a = 0 andalso cur = #" " then (x = x + 1; a @ [])
else a @ [cur]) [] (explode str)))))), x)
end;
trimStarsOnNode ("***hello", 3);
(* ("hello", 6) *) を出力する必要がありますが、出力します("hello", 3)