Okada Hiroshi の blog

typo が多いです

Haskell 勉強記録 19 日目

昨日はさぼってしまいました。

今日は 第8章:入出力 いくつかの便利なI/O関数 の途中 (位置 4056/11175) まで読み進めました。

なかなかコードを読めるようになれません。

例えば unwords.map reverse.wordsunwords.(map reverse).words と同等なのですが、 括弧なしでは、. のほうが結合が高く見えてしまって、コードの理解に手間取ります。

I/O 関係で幾つか新しい関数が出てきましたが、これらに関しては比較的簡単に理解できました。

今まで出てきた関数

Haskell 勉強記録 16 日目

昨日はさぼってしまいました。

今日は 第7章:型や型クラスを自分で作ろう YesとNoの型クラス の途中 (位置 3582/11175) まで読み進めました。

今日はあらたに id という関数がでてきました。「与えられた引数一つをそのまま帰す」という関数です。

今まで出てきた関数 → https://gist.github.com/HiroshiOkada/e5d86cbb7f194243d2fb/bccf9ce5efc81fcd572562d40371f79d66242244

Haskell 勉強記録 15 日目

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

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

今日は 第7章:型や型クラスを自分で作ろう 再帰的なデータ構造 の終わり (位置 3379/11175) まで読み進めました。

{-# OPTIONS -Wall #-}

data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving(Show)

singleTon :: a -> Tree a
singleTon x = Node x EmptyTree EmptyTree

treeInsert :: (Ord a) => a -> Tree a -> Tree a
treeInsert x EmptyTree = singleTon x
treeInsert x (Node a left right)
    | x == a  = Node x left right
    | x < a   = Node a (treeInsert x left) right
    | x > a   = Node a left (treeInsert x right) 

とすると

inarytree.hs:9:1: Warning:
    Pattern match(es) are non-exhaustive
    In an equation for `treeInsert':
        Patterns not matched: _ (Node _ _ _)
Ok, modules loaded: Main.

という警告が出て、少し悩みました。 結局ガードの最後の部分が otherwise でなかったのが原因のようで、

treeInsert :: (Ord a) => a -> Tree a -> Tree a
treeInsert x EmptyTree = singleTon x
treeInsert x (Node a left right)
    | x == a    = Node x left right
    | x < a     = Node a (treeInsert x left) right
    | otherwise = Node a left (treeInsert x right) 

と書いたら警告は出なくなりました。

今日は、新しく出てきた関数はありませんでした。 →今まで出てきた関数

Haskell 勉強記録 14 日目

今日は 第7章:型や型クラスを自分で作ろう 再帰的なデータ構造 の途中 (位置 3305/11175) まで読み進めました。

記号文字だけを使って関数に名前をつけると、自動的に中置き関数になります。

とあったので、記号文字って具体的に何が使えるんだろうと思って

2 Lexical Structure を見てみると、

Operator symbols are formed from one or more symbol characters, as defined above (演算子シンボルは上記の一文字以上のシンボルキャラクターより構成される。)

と書いてあって、さらに

symbol   → ascSymbol | uniSymbol⟨special | _ | " | '⟩
ascSymbol   → ! | # | $ | % | & | ⋆ | + | . | / | < | = | > | ? | @ | \ | ^ | | | - | ~ | :
uniSymbol   → any Unicode symbol or punctuation

と定義されているので、Unicode のシンボルでも動くかなと思って。

infixr 5 △
(△) :: (Integral a) => a -> a -> a
m △ 0 = m
m △ n 
    | n > m     = n △ m 
    | otherwise = n △ (m `mod` n)

とか書いてみると動作しました。実用上があまり意味が無いけど、∫とかΣとかも使えると、 例示用の関数を作るのには良いかもしれません。

今日は新しく出てきた関数はありませんでした。

「すごいHaskellたのしく学ぼう!」を読んでいて出てきた関数のメモ · GitHub

Haskell 勉強記録 13 日目

今日は 第7章:型や型クラスを自分で作ろう 型シノニム の途中 (位置 3229/11175) まで読み進めました。

Haskell の type は C言語の typedef や Pascal の type みたいに型の同一性について複雑なルールがあるわけでなく、 alias みたいなもので簡単で良いと思いました。

今日は新しく出てきた関数はありませんでした。

https://gist.github.com/HiroshiOkada/e5d86cbb7f194243d2fb/4db7881250ac9b1528f7186cf66eab75345a9d3a