関数プログラミング実践入門 ──簡潔で,正しいコードを書くために

サポートページ

この記事を読むのに必要な時間:およそ 0.5 分

補足情報

P.16 見出し「F#」横のURL

URLが変更になっています(ページ内容としては同じ。2015年1月5日確認時点)

http://msdn.microsoft.com/ja-jp/library/vstudio/dd233154.aspx
http://msdn.microsoft.com/ja-jp/library/dd233154.aspx

P.17 見出し「Standard ML(SML)」の参考URLについて

SML実装はかなりの数がありますが,代表的なSML実装としてはSML/NJ(http://www.smlnj.org/)があります。ほかにも東北大のSML#(http://www.pllab.riec.tohoku.ac.jp/smlsharp/ja/)が産学連携でERPシステムを開発するなどしています。

お詫びと訂正(正誤表)

本書掲載の記述に誤りがありました。ここに訂正し,深くお詫び申し上げます。

(2016年11月28日更新)

※以下,第1刷以降,および電子版が該当。

P.68 注4

... デバッガとその使いさすさの重要性が ...
... デバッガとその使いすさの重要性が ...

P.81 本文1行め

不適切な変更後のC言語プログラム(リスト1.10)
不適切な変更後のC言語プログラム(リスト1.9

P.117 ページ内一番下のghciにおける実行例 下から6行めと、その出力

Prelude> ([1::Int] ++ [2::Int]) :: Double

<interactive>:2:2:
    Couldn't match expected type ‘Double’ with actual type ‘[Int]’
    In the expression: ([1 :: Int] ++ [2 :: Int]) :: Double
    In an equation for ‘it’: it = ([1 :: Int] ++ [2 :: Int]) :: Double
Prelude> ([1::Int] ++ [2::Int]) :: [Double]

<interactive>:2:3:
    Couldn't match expected type ‘Double’ with actual type ‘Int’
    In the expression: 1 :: Int
    In the first argument of ‘(++)’, namely ‘[1 :: Int]’
    In the expression: ([1 :: Int] ++ [2 :: Int]) :: [Double]

P.135 2行め

次にS、how
次に、Show

P.148 3行め

12と15の最小公倍数である3
12と15の最大公約数である3

P.154 ページ内のSquare.hs

Square.hs
Sample.hs

P.161 下から3行め

あるガード条件が疑になったとき
あるガード条件がになったとき

P.193 下から8行め〜

tarai 10 20 ...という形になるため,この時点yがx以上であることが判明し,3つめの引数を計算するまでもなく結果として20を得られるはずです.
tarai1 4 ...という形になるため,この時点でyがx以上になっていることが判明し,3つめの引数を計算するまでもなく結果として4を得られるはずです.

P.194 図4.1:C++版たらい回し関数の様子

P194図4.1誤
P194図4.1正

P.194 図4.2:Haskell版たらい回し関数の様子

P194図4.2誤
P194図4.2正

P.205 簡約パターンの2つめのリストの,1行め〜2行め

(\x -> x + x) ((\x -> x + x) a)
(\x -> x + x) ((\x -> x + x) 1)

P.224 2行め

Maube
Maybe

P.225 下から2行め

定義した対して
定義した型に対して

P.226 リスト5.1:キャプション

ToInt.hs
toint.cpp

P.227 リスト5.2:キャプション

toint.cpp
ToInt.hs

P.228 最下行

確認にしておきます
確認しておきます

P.238 1つめのサンプルコード中(2)のコメント

yにアクションgに適用
yにアクションg適用

P.238 12行め

yにアクションgに適用
yにアクションg適用

P.242 eval exprのコード内の4行めおよび5行め

toBinOp sop >>= ¥b ->
toNum sb >>= ¥c ->
toBinOp sop >>= ¥op ->
toNum sb >>= ¥b ->

P.246 ページ中ほどのサンプルコード内の1行めおよび2行め内

n mod p
n `mod` p

P.249 10-11行め

アクション同士を組み合わせ
アクション同士組み合わせ

P.261 「副作用を扱えるのに純粋と言える理由」内:本文リスト

Moand m => x -> m a
Monad m => x -> m a

P.262 15-16行め

なっていつ必要があります
なってい必要があります

P.264 見出し「Optionalクラス」内,1つめのリストの3行め

Optional< Wallet > wallet = person.getWallet();
Optional< Wallet > wallet = person.get().getWallet();

P.264 見出し「Optionalクラス」内,1つめのリストの5行め

Optiona< Money > money = wallet.getMoney(10000);
Optional< Money > money = wallet.get().getMoney(10000);

P.264 見出し「Optionalクラス」内,2つめのリストの4行め

.flatMap(wallet -> wallet.getMoney(100))
.flatMap(wallet -> wallet.getMoney(10000))

P.265 見出し「メソッドチェーンの弊害」内,1つめのリスト

Optional< Person > person = persons.find("Alice");
if (person1.isPresent()) { // Aliceがいて
    Optional< Pocket > pocket = person.getPocket();
    if (pocket.isPresent()) { // ポケットがあって
        Optiona< Money > ticket = pocket.getTicket();
        if (ticket.isPresent() ) { // 引換券を持っている
            Optional< Wallet > wallet = person.getWallet();
            if (wallet.isPresent()) { // 財布を持っていて
                Optiona< Money > money = wallet.getMoney(10000);
                if (money.isPresent()) { // 10000円入っている
                    pay(ticket.get(), money.get());
                }
            }
        }
    }
}
Optional< Person > person = persons.find("Alice");
if (person1.isPresent()) { // Aliceがいて
    Optional< Pocket > pocket = person.get().getPocket();
    if (pocket.isPresent()) { // ポケットがあって
        Optional< Ticket > ticket = pocket.get().getTicket();
        if (ticket.isPresent() ) { // 引換券を持っている
            Optional< Wallet > wallet = person.get().getWallet();
            if (wallet.isPresent()) { // 財布を持っていて
                Optional< Money > money = wallet.get().getMoney(10000);
                if (money.isPresent()) { // 10000円入っている
                    pay(ticket.get(), money.get());
                }
            }
        }
    }
}

P.265 見出し「メソッドチェーンの弊害」内,2つめのリスト

persons
    .find("Alice")
    .isPresent(person -> person.getTicket()
                             .ifPresent(ticket -> person.getWallet()
                                                      .flatMap(wallet -> wallet.getMoney(100))
                                                      .ifPresent(money -> pay(ticket, money))))
persons
    .find("Alice")
    .isPresent(person -> person.getPocket()
                             .flatMap(pocket -> pocket.getTicket()
                                               .ifPresent(ticket -> person.getWallet()
                                                                   .flatMap(wallet -> wallet.getMoney(10000))
                                                                   .ifPresent(money -> pay(ticket, money)))))

P.265 ページ中ほどのJavaサンプルコード内の2行め

if (person1.isPresent()) {
if (person.isPresent()) {

P.266 見出し「メソッドチェーンの弊害」内,3つめのリスト

find "Alice" persons >>= \person ->
getTicket person >>= \ticket ->
getWallet person >>= \wallet ->
getMoney 100 wallet >>= \money ->
pay ticket money
find "Alice" persons >>= \person ->
getPocket person >>= \pocket ->
getTicket pocket >>= \ticket ->
getWallet person >>= \wallet ->
getMoney 10000 wallet >>= \money ->
pay ticket money

P.266 見出し「メソッドチェーンの弊害」内,4つめのリスト

do person <- find "Alice" persons
   ticket <- getTicket person
   wallet <- getWallet person
   money <- getMoney 100 wallet
   pay ticket money
do person <- find "Alice" persons
   pocket <- getPocket person
   ticket <- getTicket pocket
   wallet <- getWallet person
   money <- getMoney 10000 wallet
   pay ticket money

P.278 ページ最上部のサンプルコード内のコメント部分

---
--- <<< rle “A”
--- ""
--- <<< rle “A”

P.306 サンプルコード内の上から5行めおよび下から3行め

mkPowerOf2
makePowerOf2

P.330 17行め

見らることができます
見ることができます

P.351 コラム中,3行め

適切に行わなければ
適切に行わなければ

P.359 14行め

時期バージョン
次期バージョン

P.369 26行め

与える(hacking)することができます
与えること(hacking)ができます

P.372 2行め

代入がによる変更
代入による変更

以下,第1刷のみ。第2刷以降および最新の電子版では修正済み。

P.28 注38
P.33 14行め
P.39 15行め

参照等価性
参照透過

P.33 6行め

手続きの中にであっても
手続きの中であっても

P.73 箇条書き1-1

処理が有効値を返せば引き続きその値を有効値を返す
処理が有効値を返せば引き続きその値を有効値として返す

P.74 サンプルコード最終行

expr
eval

P.112 図2.3中

誤
正