lists:foreach在Erlang中返回ok

Ron*_*Nnn 4 erlang

我刚开始在Erlang,发现很难理解.我想将列表拆分为一个字符串,string:titlecase在其上运行,并将其加入一个字符串.

namecase(Text) ->
    TextArray = string:split(Text, " ", all),
    lists:join(" ", lists:foreach(fun(Element) -> string:titlecase(Element) end, TextArray)).
Run Code Online (Sandbox Code Playgroud)

但它失败并显示错误消息,escript: exception error: no function clause matching lists:join(" ",ok) (lists.erl, line 1449)因为它返回ok,为什么它返回正常?

Dog*_*ert 10

lists:foreach不返回传递给它的函数返回的值.它意味着与仅产生副作用的功能(例如打印)一起使用.你在找lists:map.

1> Text = "foo bar baz".
"foo bar baz"
2> TextArray = string:split(Text, " ", all).
["foo","bar","baz"]
3> lists:join(" ", lists:map(fun(Element) -> string:titlecase(Element) end, TextArray)).
["Foo"," ","Bar"," ","Baz"]
Run Code Online (Sandbox Code Playgroud)

而且,使用fun module:name/arity语法可以缩短匿名函数:

4> lists:join(" ", lists:map(fun string:titlecase/1, TextArray)).
["Foo"," ","Bar"," ","Baz"]
Run Code Online (Sandbox Code Playgroud)

  • 也许再添加一个精炼步骤(在更换乐趣之后),用列表理解替换`lists:map`?它可能是先进的,但它也是惯用的. (3认同)