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