今年も終わりですね
モジュールの続きをやっていく
各桁の数の合計が40になる最初の自然数を求める関数の実装
- 数値を文字列に変換
- 文字列をリスト化
- 文字を数に変換
- リストの合計を計算
このように処理する。
Data.Char.digitToInt
で文字を数値に変換する('0'-'9','A'-'F'に対して動作する。小文字可)
*Main> digitToInt '3' 3
数を引数にとって、各桁の数の合計を返す関数
import Data.List import Data.Char digitSum :: Int -> Int digitSum = sum . map digitToInt . show
実行結果
*Main> digitSum 12345 15
この関数を使って各桁の合計が40になる数を探すために、Data.List.find
を使う
*Main> :t find find :: Foldable t => (a -> Bool) -> t a -> Maybe a
1つめの引数に述語をとり、2つめの引数にリストをとる。
関数が返すMaybe a
は、0個かちょうど1個の要素だけを持てる。この型は失敗する可能性があることを表現するのに使われる。
Nothing
は何も持っていないという値を作るときに使い、Just
は何かを保持している値を作るときに使う。
*Main> Nothing Nothing *Main> Just 3 Just 3 *Main> :t Nothing Nothing :: Maybe a *Main> :t Just 3 Just 3 :: Num a => Maybe a *Main> :t Just True Just True :: Maybe Bool
find
で述語を満たす要素が見つかった場合、その要素をJust
でラップしたものが返される。見つからなければNothing
が返る。
*Main> find (>5) [1,2,3,4,5,6] Just 6 *Main> find (>5) [1,2,3,4,5] Nothing
上記をふまえ、各桁の合計が40になる数を求める関数を実装する
firstTo :: Int -> Maybe Int firstTo n = find (\x -> digitSum x == n) [1..]
実行結果
*Main> firstTo 40 Just 49999
所感
Maybe
便利。関数を自分で書くのはまだ難しい。読めるようにはなっているけど。

- 作者: MiranLipovaca
- 出版社/メーカー: オーム社
- 発売日: 2017/07/14
- メディア: Kindle版
- 購入: 4人 クリック: 9回
- この商品を含むブログを見る