fugafuga.write

日々のログ

2017-12-01から1ヶ月間の記事一覧

2017ふりかえり

風呂の中でふりかえる。 転職 年始に転職せざるを得ない状況になった。転職活動を始めてすぐに決まったのは良かったし、Rails で仕事できているのでとりあえず合格というところ。年収は上がった。 技術 Ruby, Rails は業務で使ってはいるが、まだまだわから…

すごいH本 part31

今年も終わりですね モジュールの続きをやっていく 各桁の数の合計が40になる最初の自然数を求める関数の実装 数値を文字列に変換 文字列をリスト化 文字を数に変換 リストの合計を計算 このように処理する。 Data.Char.digitToIntで文字を数値に変換する('0…

すごいH本 part30

モジュールを使う。の続き foldlがスタックオーバーフローを起こすことがあるのでそれを見てゆく。 *Main> foldl (+) 0 (replicate 100000000 1) *** Exception: stack overflow Haskell は遅延評価なので実際の値の計算は可能な限り後まで引き伸ばされる。 …

すごいH本 part29

モジュールを使う。の続き Data.Charを使ってシーザー暗号でメッセージを暗号化し、他人に読めないようにする関数を実装する。 シーザー暗号は、各文字をアルファベット上で一定の数だけシフトするという暗号化方法。 以下の関数を使う Data.Char.ord 文字を…

Elm ことはじめ

Elm

環境設定 Elm を入れる npm install -g elm npm install -g elm-format@exp npm install -g elm-test elm-format 使うため、elm-vim入れる GitHub - ElmCast/elm-vim: Elm plugin for Vim npm install -g elm-oracle とりあえずドリルやる GitHub - jinjor/e…

すごいH本 part28

引き続きモジュールの使用例 2つのリストを受け取り、1つめのリストが2つめのリストに含まれているかどうかを調べる関数を実装してゆく。 以下の関数を使う Data.List.tails リストを受け取り、tailsを繰り返し適用する *Main Data.List> tails "yahooooooo…

Amazon EC2インスタンスを他のアカウントに移管する

AWS

これ読むとよい Amazon EC2 インスタンスの移管 よくわからんものを調べる AMI Amazon Machine Image の略。 なにをしてくれるか インスタンスのルートボリュームのテンプレート (オペレーティングシステム、アプリケーションサーバー、アプリケーションなど…

すごいH本 part27

モジュールを使う 単語が複数含まれた文字列から各単語が何回現れるかを求めたい。 以下のモジュールと関数を組み合わせる。 Data.Listのwords 空白で区切られた単語をリストにする。 *Main Lib Data.List> words "foo bar hoge hooogle" ["foo","bar","hoge…

すごいH本 part26

クリスマス後に4℃のアクセサリが多数オークションに出品されるのはとても趣がある。 モジュール Haskell にはモジュールがある。モジュールには複数の関数と型を定義できる。 そのモジュールのうちの幾つか、または全てをエクスポートできる。 エクスポート…

すごいH本 part25

サンタさん、5000兆円ください ポイントフリースタイル この関数を sum' :: (Num a) => [a] -> a sum' xs = foldl (+) 0 xs こう書き換えられる sum' :: (Num a) => [a] -> a sum' = foldl (+) 0 fold (+) 0 はリストを受け取る関数を返すため 他の例 fn x =…

すごいH本 part24

メリークリスマス チキン食いました 関数合成 .関数を使う。 他の関数に渡す関数をその場で作るときに使う。ラムダ式でできるが、関数合成のほうが簡潔に書けるらしい。 *Main> :t (.) (.) :: (b -> c) -> (a -> b) -> a -> c 関数を2つ引数にとって引数を1…

わたしができるまで 2017

メリークリスマス みなさん、チキン食ってますか?サンタにはちゃんと5000兆円ほしいってお願いしましたか? ...よいでしょう。 この記事は、 しがないラジオ Advent Calendar 2017 - Adventar の24日目の投稿となります。 わたしは誰 軽く自己紹介をします…

すごいH本 part23

$を使った関数適用 関数適用 = 関数呼び出しのこと 括弧の数を少なくしたい場合に役に立つらしい *Main> :t ($) ($) :: (a -> b) -> a -> b 普通の関数適用は左結合 f a b c は、 ((f a) b) c) となるので、(f a)から適用される。 $を使わない例 *Main> sum …

すごいH本 part22

真・畳み込みのコーナー 無限リストを畳み込む and 関数を foldr で実装し、foldr が無限リストを正しく処理できるのを確認していく 実装する and' :: [Bool] -> Bool and' xs = foldr (&&) True xs リストが全部Trueの場合にTrueを返して欲しいので、(&&)関…

すごいH本 part21

続・畳み込みのコーナー foldl1 と foldr1 foldl と foldr に似ているが、初期アキュムレータを明示的に与える必要がない 最大値を求める maximum を実装すゆ maximum' :: (Ord a) => [a] -> a maximum' = foldl1 max 実行結果 *Main> maximum' [1,2,3,4,5] …

すごいH本 part20

畳み込み リストに対する関数を扱う際、 基底部は空リストとし、パターンを使ってリストを先頭要 素と残りのリストに分解する というパターンが頻繁に出てくるので、Haskell には 畳み込み(fold) と呼ばれる便利な関数があるらしい。 畳み込みを使うと、デ…

歌う時に気をつけていること

歌の練習を何年も前から独学でやっている。 歌以外でも発声する場面で意識するようにしている。会話をするような時でも声が通りやすくなるので役に立つ。 最近気づいたことを書いていく。 軟口蓋を上げる これはあくびの喉の形でのどちんこを上げることがで…

すごいH本 part19

ラムダ式 ラムダ式とは、1回だけ必要な関数を作る時に使う無名関数です。 通常、高階関数に渡す関数を作るためだけに使われるらしい バックスラッシュを書いてからこのようにする。 (\{引数1} {引数2} -> {関数本体}) 普通、ラムダ式は括弧で囲むとのこと。 …

fish shell で xargs -J するときの注意点

カレントディレクトリの全てをディレクトリpにまとめたかった。 これでは動かない > find . -type d ! -name 'p' | grep './' | xargs -J % mv % p/ これで動く > find . -type d ! -name 'p' | grep './' | xargs -J \% mv \% p/ fish shell では %と{}は特…

すごいH本 part18

map と filter ふたたび 10万以下の数のうち3829で割り切れる最大の数を探す largestDivisible :: Integer largestDivisible = head (filter p [100000,99999..]) where p x = x `mod` 3829 == 0 実行結果 *Main> largestDivisible 99554 10000 より小さい全…

すごいH本 part17

便利な関数 map 関数とリストを受け取ってその関数をリスト全ての要素に適用して新しいリストを生成する。 *Main> :t map map :: (a -> b) -> [a] -> [b] 実装 map' :: (a -> b) -> [a] -> [b] map' _ [] = [] map' f (x:xs) = f x : map' f xs 実行 *Main> …

すごいH本 part16

高階関数を実装する 高階関数は関数を引数として受け取ることができるし、返り値として関数を返すこともできる。 関数を受け取ってそれを2回適用する高階関数 applyTwice :: (a -> a) -> a -> a applyTwice f x = f (f x) 実行結果 *Main> applyTwice (+3) 1…

すごいH本 part15

高階関数 引数に関数を受け取ったり、関数を返すような関数を高階関数という。 Haskell を学ぶ上でとても大事な考え方らしい。 カリー化関数 カリー化関数とは複数の引数を取る代わりに、常にちょうど1つの引数を取る関数です。 カリー化関数が呼び出される…

すごいH本 part14

クイックソートを実装する ソートアルゴリズムはこんな感じ リストから任意の数を選ぶ(この数字をピボットと呼ぶ) ピボットより大きい数字を右側に、ピボット以下の数字を左側に移動する ピボットを除いた左右のリストに対して、1. 2. の手順を繰り返してい…

すごいH本 part13

再帰 再帰とは、関数の定義の中で自分自身を呼び出す、という関数の定義の仕方 関数を再帰的に定義するためには、 問題を同じ種類のより小さな問題に分解する 問題の基底部を見つける 基底部とはこれ以上分解できない問題の単位 複数あることもある を行う必…

すごいH本 part12

case 式 コード中のどこででもパターンマッチが使えるようになる。case は式である。 head' :: [a] -> a head' xs = case xs of [] -> error "error." (x:_) -> x 関数のパターンマッチは case のシンタックスシュガーとなっている。 head' :: [a] -> a head…

レビュー時のこころがけ

開発時にコードレビューや設計レビューを行う機会がある。 良いレビュー、悪いレビューって何だ?ということを考えたりしたので書く。 悪いレビュー レビュアー 主観しかない 何かに基いて指摘していない 根拠がゆるふわである 宗教上の理由で、とか言う 感…

すごいH本 part11

let 式 どこでも変数を束縛できる let 式が作る束縛は局所的でガード間で共有されない パターンマッチが使える 例 cylinder :: Double -> Double -> Double cylinder r h = let sideArea = 2 * pi * r * h topArea = pi * r ^ 2 in sideArea + 2 * topArea l…

すごいH本 part10

パート10までやってきた自分えらい ガード 引数の構造で場合分け パターンマッチを使う 引数の値が満たす性質で場合分け ガードを使う 例 bmiTell :: Double -> String bmiTell bmi | bmi <= 18.5 = "You're underweight, you emo, you!" | bmi <= 25.0 = "Y…

すごいH本 part9

やっていきのこころ パターンマッチ パターンに従ってデータを分解するときに使う luckey :: Int -> String luckey 7 = "Luckey!!!" luckey x = "Unluckey!!!" パターンが上から下の順で評価される パターンが合致するとそのパターンの本体が実行される *Mai…