fugafuga.write

日々のログ



すごいH本 part31

今年も終わりですね

モジュールの続きをやっていく

各桁の数の合計が40になる最初の自然数を求める関数の実装

  1. 数値を文字列に変換
  2. 文字列をリスト化
  3. 文字を数に変換
  4. リストの合計を計算

このように処理する。

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便利。関数を自分で書くのはまだ難しい。読めるようにはなっているけど。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

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