あどけない話

Internet technologies

Haskellでデザインレシピ

お茶の水女子大学 理学部 情報科学科 准教授 浅井健一さんインタビューを読んで、思い出しだので書いておきます。

デザインレシピを使ったプログラミングを実践するなら Haskell が最適です。以下に簡単な例を示します。

目的

作成するプログラムが何をするのかを考える。何を受け取り何を返すのかを特定し、それをもとにプログラムのヘッダを作成する。

例として、数字の文字列を取り整数を返す関数 stringToInt を考えましょう。まず、関数の型注釈を書いて、本体を undefined にしておきます。

module Foo where

-- | Converting 'String' to 'Int.
stringToInt :: String -> Int
stringToInt = undefined

コンパイルが通ることを確認しましょう。

プログラムの動きをより明確かつ具体的にするため、望まれる入力と出力の例を作成する。そして、それを実行可能なテストプログラムに変更する。

Haddock 形式のコメントに、doctest でも利用できる動作例を書きます。

module Foo where

-- | Converting 'String' to 'Int.
--
-- >>> stringToInt "123"
-- 123
-- >>> stringToInt "4567"
-- 4567

stringToInt :: String -> Int
stringToInt = undefined

本体

プログラムの本体を作成する。目的のところではプログラムが「何を」するのかを考えたが、ここでは「どうやって」実現するかを考える。

いよいよ実装です。

module Foo where

import Data.List
import Data.Char

-- | Converting 'String' to 'Int.
--
-- >>> stringToInt "123"
-- 123
-- >>> stringToInt "4567"
-- 4567

stringToInt :: String -> Int
stringToInt = foldl' (\x y -> x * 10 + charToInt y) 0
  where
    charToInt c = ord c - ord '0'

テスト

確かに望む動作をしているか、上で作ったテストプログラムを使って確認する。望む動作をしていなかったら原因をこのデザインレシピに沿って考え、誤りを正す。

最後に doctest を使って、例題が意図通りに動くかテストしましょう。

% doctest Foo.hs
Examples: 2  Tried: 2  Errors: 0  Failures: 0

合わせて読みたい