Haskell

『入門Haskell』練習問題例解(15)

『入門Haskell』最後の問題です。 Base64(エンコード) p.144の(1)です。 (1) このBase64エンコードは「76文字以内に改行を入れる」ということが行われていません。これに対する対処を、以下の2つのアプローチで実装しなさい。 1. base64Encode関数でevalSt…

『入門Haskell』練習問題例解(14)

p.128。モナド関連の関数です。 1. sequence_ を foldr を使って定義しなさい。 2. mapM と mapM_ を定義しなさい(sequenceなどを使ってもよい)。 3. foldM と foldM_ を定義しなさい。 sequence_ mySequence_ :: Monad m => [m a] -> m () mySequence_ = …

『入門Haskell』練習問題例解(13)

p.113です。 (1)木の最大深さを計算する関数depthを書きなさい。 (2)上で示したtreeToList(p.112)は、リストの順序が滅茶苦茶になっています。これを、キーの昇順に並べるように実装しなおしなさい。 昇順に並んだリストを返す関数はtreeToSortedListとしま…

『入門Haskell』練習問題例解(12)

p.106です。 (1) MaybeはOrd a => Ord (Maybe a)でもあります。このインスタンス宣言を行いなさい。またShow a => Show (Maybe a)のインスタンス宣言も行いなさい。 (2) 2章で見たように、Ordの宣言の概略は次のようになっています。(中略)これにデフォル…

圏論

Haskellにおけるモナドと圏論の関係についてこの論文が非常に参考になりました。 The Haskell Programmer's Guide to the IO Monad --- Don't Panic 関手や自然変換について、ごくごく基本的なレベルですが腹の底から理解できました。MaybeモナドやListモナ…

『入門Haskell』練習問題例解(11)

第4章、p.101です。今回を含めてあと5問です。 (前略) たとえば次のように data MyType = I Int | F Float | C Char ここでたとえば [I 10, F 10, C 'a'] のようなリストがあるとします。 (1)[MyType]からC要素だけ取り出すfilterCを書きなさい。 (2)[MyTy…

『入門Haskell』練習問題例解(10)

第3章最後の練習問題です。 cat p.94の(1)です。 整数を2つ引数に取り、ケタ数が足りないときには空白を詰める関数 showN を定義しなさい。次のような実行形態を想定しています。 showN 10 1 == " 1" showN 3 20 == " 20" showN 2 100 == "100"また、これを…

『入門Haskell』練習問題例解(9)

p.87の練習問題です。「格子点の列挙問題」と言うそうです。 lattice関数を改良し、現在の2次元格子点限定から任意のn次元格子点に対応するように Integer -> Integer -> [[Integer]]の型を持つようにしなさい。また、それを利用してall_latticeもn次元格子…

『入門Haskell』練習問題例解(8)

repeat, cycle, iterate p.86の(1)(2)をいっぺんに解きます。 (1)repeat, cycle, iterateをそれぞれ自分で定義しなさい。(2)repeat, cycle, iterateのうち、どれか1つを自分で定義し、残りの2つはその定義した関数をもとに定義しなさい。ほかのPrelude関数を…

『入門Haskell』練習問題例解(7)

filter, inits, tails, zip, zipWith p.78の(1)です。 filter, inits, tails, zip, zipWith を定義しなさい。 initsは第一要素が空リスト、tailsは最後の要素が空リストになるので注意が必要です。初版第一刷p.75のinits、tailsの説明は誤っています。ご注意…

タブ文字数

Haskellプログラミングの際はエディタのタブ文字数を「8」に設定しましょう。

モナドって何さ

モナド…ああライプニッツの? ↓ 何か難しそうだけどHaskellにとって本質的なものらしい ↓ returnとbindがわかんねぇ ↓ returnとbindはわかったけど、これで何が出来るようになるの? ←今ここ

『入門Haskell』練習問題例解(6)

foldl p.73の(1)です。 foldl (+) 0 [1, 2, 3, 4, 5] について、動作ステップを確認しなさい。 foldlの定義は foldl :: (a -> b -> a) -> a -> [b] -> a foldl f z [] = z foldl f z (x:xs) = foldl f (f z x) xs となっています。では確認してみます。 fold…

『入門Haskell』練習問題例解(5)

takeとdrop ではp.72の(1)から。 前ページの実装から、takeとdropに大きな値や負の値が入った場合の対処を行いなさい。 これは仕様通りに myTake :: Int -> [a] -> [a] myTake _ [] = [] myTake n _ | n <= 0 = [] myTake n (x:xs) = x : myTake (n-1) xs my…

『入門Haskell』練習問題例解(2)

p.33 wordScan利用版のwordsCountで、同じように`〜'を1単語とみなす拡張を追加しなさい。またその際、wordScanを積極的に利用すること。 wordScanを積極的に使えとのことなので、以下のように書いてみた。 import Char wordsCount str = outWords str where…

『入門Haskell』練習問題例解(4)

セイントオクトーバー第4話「ロリ迷惑!超昼間から吸血鬼!」 見ました。かつて息の臭いヒロインなんていただろうか?(いや、いない) 視聴できない人はi-revoで見られますよ〜。今は第3話を配信しています。 それはともかく では問題を解きます。今回から…

『入門Haskell』練習問題例解(3)

p.50 実際にwc.hsの内容を見直して、カリー化によって省略できるところをすべて省略しなさい。 wc.hsというのはp.37に載っています。関数の部分適用で変数を消去していきます。なお、(\n -> 1 + n) はまだそのままにしておきます。 import Char import Syste…

『入門Haskell』練習問題例解(1)

それでは始めます。『入門Haskell―はじめて学ぶ関数型言語』(向井淳, 2006, 毎日コミュニケーションズ)p.31の練習問題の例解です。 p.31 (1) (1) linesCount では、空白行が続く場合にどんどんカウントしていきます。これを空白行(何もない行)を無視する…

foldl とfoldr - foldrに無限リストを与えるとどうなるか?

foldlは左側からの畳み込みを行う関数で、仕様書では foldl :: (a -> b -> a) -> a -> [b] -> a foldl f z [] = z foldl f z (x:xs) = foldl f (f z x) xs と定義されています。したがって foldl f z [x1, x2, x3, ... , xn_1, xn] = f (f ( ... f (f (f z x…

Haskell - 関数の変形 3つの定理

『入門Haskell』の練習題に取り掛かる前に。NetaBBSにも書きましたが、合成関数について以下のことが成り立ちます。 (定理1) f, gはいずれも1変数関数とする。 このとき、関数 (\x -> g(f(x)) は 合成関数 (g.f) に等しい。 (定理2) fを2変数関数、gを1変数…

『入門Haskell』

ちょっと前から『入門Haskell』でHaskellを勉強しています。 練習問題がたくさんあるので勉強になります。 でも解答がないんです。なので、僕の解答を少しずつ貼っていこうと思います。