作者:爷们疯子2_593_278 | 来源:互联网 | 2022-12-03 18:05
我刚开始在Erlang,发现很难理解.我想将列表拆分为一个字符串,string:titlecase
在其上运行,并将其加入一个字符串.
namecase(Text) ->
TextArray = string:split(Text, " ", all),
lists:join(" ", lists:foreach(fun(Element) -> string:titlecase(Element) end, TextArray)).
但它失败并显示错误消息,escript: exception error: no function clause matching lists:join(" ",ok) (lists.erl, line 1449)
因为它返回ok
,为什么它返回正常?
1> Dogbert..:
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"]
而且,使用fun module:name/arity
语法可以缩短匿名函数:
4> lists:join(" ", lists:map(fun string:titlecase/1, TextArray)).
["Foo"," ","Bar"," ","Baz"]
也许再添加一个精炼步骤(在更换乐趣之后),用列表理解替换`lists:map`?它可能是先进的,但它也是惯用的.