3

私はlensパッケージで遊んでいて、レンズだけを使って文字列を大文字にしようとしています。toUpper基本的に、すべての単語の最初の各要素を呼び出したいと思います。それはそれで簡単に思えますが、私はそれを行う方法をまったく理解できません。traversable が必要ですか? スペースなどで分割するにはどうすればよいですか...

4

3 に答える 3

4

words繰り返しのスペースを単一のスペースに変換するため、呼び出すのは実際には同形ではありませんが、unwordsふりをしましょう。

words :: Iso' String [String]
words = iso Prelude.words Prelude.unwords

overこれで、各単語の最初の文字に焦点を当てたレンズを構築し、適用して単語を大文字にすることができます。toUpper

capitalize :: String -> String
capitalize = over (words . traverse . _head) toUpper
于 2014-07-09T12:31:28.773 に答える
3

繰り返されるスペースを折りたたまないソリューション:

import Control.Lens
import Data.List.Split
import Data.List.Split.Lens
import Data.Char

capitalize :: String -> String
capitalize = view $ splitting (whenElt isSpace) traversed.to (over _head toUpper)
于 2014-07-09T15:19:45.877 に答える
3
capitalize xs = xs & words <&> _head %~ toUpper & unwords

さて、それが解決策ですが、どうやってそこにたどり着くのでしょうか? レンズパーツを外してみましょう。(<&>)との交換: fmap_(&)($)

capitalize xs = unwords $ fmap (_head %~ toUpper) $ words $ xs

これは見覚えがある。リストの最初の要素に_head %~ f適用されます。f最後に、これは (ほぼ* ) と同等です

capitalize xs = unwords $ fmap (\(x:xs) -> toUpper x : xs) $ words $ xs

あなたはおそらくよく知っています。


*_head空のリストの場合も処理します

于 2014-07-09T12:05:00.230 に答える