2017-12-01から1ヶ月間の記事一覧
風呂の中でふりかえる。 転職 年始に転職せざるを得ない状況になった。転職活動を始めてすぐに決まったのは良かったし、Rails で仕事できているのでとりあえず合格というところ。年収は上がった。 技術 Ruby, Rails は業務で使ってはいるが、まだまだわから…
今年も終わりですね モジュールの続きをやっていく 各桁の数の合計が40になる最初の自然数を求める関数の実装 数値を文字列に変換 文字列をリスト化 文字を数に変換 リストの合計を計算 このように処理する。 Data.Char.digitToIntで文字を数値に変換する('0…
モジュールを使う。の続き foldlがスタックオーバーフローを起こすことがあるのでそれを見てゆく。 *Main> foldl (+) 0 (replicate 100000000 1) *** Exception: stack overflow Haskell は遅延評価なので実際の値の計算は可能な限り後まで引き伸ばされる。 …
モジュールを使う。の続き Data.Charを使ってシーザー暗号でメッセージを暗号化し、他人に読めないようにする関数を実装する。 シーザー暗号は、各文字をアルファベット上で一定の数だけシフトするという暗号化方法。 以下の関数を使う Data.Char.ord 文字を…
環境設定 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…
引き続きモジュールの使用例 2つのリストを受け取り、1つめのリストが2つめのリストに含まれているかどうかを調べる関数を実装してゆく。 以下の関数を使う Data.List.tails リストを受け取り、tailsを繰り返し適用する *Main Data.List> tails "yahooooooo…
これ読むとよい Amazon EC2 インスタンスの移管 よくわからんものを調べる AMI Amazon Machine Image の略。 なにをしてくれるか インスタンスのルートボリュームのテンプレート (オペレーティングシステム、アプリケーションサーバー、アプリケーションなど…
モジュールを使う 単語が複数含まれた文字列から各単語が何回現れるかを求めたい。 以下のモジュールと関数を組み合わせる。 Data.Listのwords 空白で区切られた単語をリストにする。 *Main Lib Data.List> words "foo bar hoge hooogle" ["foo","bar","hoge…
クリスマス後に4℃のアクセサリが多数オークションに出品されるのはとても趣がある。 モジュール Haskell にはモジュールがある。モジュールには複数の関数と型を定義できる。 そのモジュールのうちの幾つか、または全てをエクスポートできる。 エクスポート…
サンタさん、5000兆円ください ポイントフリースタイル この関数を sum' :: (Num a) => [a] -> a sum' xs = foldl (+) 0 xs こう書き換えられる sum' :: (Num a) => [a] -> a sum' = foldl (+) 0 fold (+) 0 はリストを受け取る関数を返すため 他の例 fn x =…
メリークリスマス チキン食いました 関数合成 .関数を使う。 他の関数に渡す関数をその場で作るときに使う。ラムダ式でできるが、関数合成のほうが簡潔に書けるらしい。 *Main> :t (.) (.) :: (b -> c) -> (a -> b) -> a -> c 関数を2つ引数にとって引数を1…
メリークリスマス みなさん、チキン食ってますか?サンタにはちゃんと5000兆円ほしいってお願いしましたか? ...よいでしょう。 この記事は、 しがないラジオ Advent Calendar 2017 - Adventar の24日目の投稿となります。 わたしは誰 軽く自己紹介をします…
$を使った関数適用 関数適用 = 関数呼び出しのこと 括弧の数を少なくしたい場合に役に立つらしい *Main> :t ($) ($) :: (a -> b) -> a -> b 普通の関数適用は左結合 f a b c は、 ((f a) b) c) となるので、(f a)から適用される。 $を使わない例 *Main> sum …
真・畳み込みのコーナー 無限リストを畳み込む and 関数を foldr で実装し、foldr が無限リストを正しく処理できるのを確認していく 実装する and' :: [Bool] -> Bool and' xs = foldr (&&) True xs リストが全部Trueの場合にTrueを返して欲しいので、(&&)関…
続・畳み込みのコーナー foldl1 と foldr1 foldl と foldr に似ているが、初期アキュムレータを明示的に与える必要がない 最大値を求める maximum を実装すゆ maximum' :: (Ord a) => [a] -> a maximum' = foldl1 max 実行結果 *Main> maximum' [1,2,3,4,5] …
畳み込み リストに対する関数を扱う際、 基底部は空リストとし、パターンを使ってリストを先頭要 素と残りのリストに分解する というパターンが頻繁に出てくるので、Haskell には 畳み込み(fold) と呼ばれる便利な関数があるらしい。 畳み込みを使うと、デ…
歌の練習を何年も前から独学でやっている。 歌以外でも発声する場面で意識するようにしている。会話をするような時でも声が通りやすくなるので役に立つ。 最近気づいたことを書いていく。 軟口蓋を上げる これはあくびの喉の形でのどちんこを上げることがで…
ラムダ式 ラムダ式とは、1回だけ必要な関数を作る時に使う無名関数です。 通常、高階関数に渡す関数を作るためだけに使われるらしい バックスラッシュを書いてからこのようにする。 (\{引数1} {引数2} -> {関数本体}) 普通、ラムダ式は括弧で囲むとのこと。 …
カレントディレクトリの全てをディレクトリpにまとめたかった。 これでは動かない > find . -type d ! -name 'p' | grep './' | xargs -J % mv % p/ これで動く > find . -type d ! -name 'p' | grep './' | xargs -J \% mv \% p/ fish shell では %と{}は特…
map と filter ふたたび 10万以下の数のうち3829で割り切れる最大の数を探す largestDivisible :: Integer largestDivisible = head (filter p [100000,99999..]) where p x = x `mod` 3829 == 0 実行結果 *Main> largestDivisible 99554 10000 より小さい全…
便利な関数 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> …
高階関数を実装する 高階関数は関数を引数として受け取ることができるし、返り値として関数を返すこともできる。 関数を受け取ってそれを2回適用する高階関数 applyTwice :: (a -> a) -> a -> a applyTwice f x = f (f x) 実行結果 *Main> applyTwice (+3) 1…
高階関数 引数に関数を受け取ったり、関数を返すような関数を高階関数という。 Haskell を学ぶ上でとても大事な考え方らしい。 カリー化関数 カリー化関数とは複数の引数を取る代わりに、常にちょうど1つの引数を取る関数です。 カリー化関数が呼び出される…
クイックソートを実装する ソートアルゴリズムはこんな感じ リストから任意の数を選ぶ(この数字をピボットと呼ぶ) ピボットより大きい数字を右側に、ピボット以下の数字を左側に移動する ピボットを除いた左右のリストに対して、1. 2. の手順を繰り返してい…
再帰 再帰とは、関数の定義の中で自分自身を呼び出す、という関数の定義の仕方 関数を再帰的に定義するためには、 問題を同じ種類のより小さな問題に分解する 問題の基底部を見つける 基底部とはこれ以上分解できない問題の単位 複数あることもある を行う必…
case 式 コード中のどこででもパターンマッチが使えるようになる。case は式である。 head' :: [a] -> a head' xs = case xs of [] -> error "error." (x:_) -> x 関数のパターンマッチは case のシンタックスシュガーとなっている。 head' :: [a] -> a head…
開発時にコードレビューや設計レビューを行う機会がある。 良いレビュー、悪いレビューって何だ?ということを考えたりしたので書く。 悪いレビュー レビュアー 主観しかない 何かに基いて指摘していない 根拠がゆるふわである 宗教上の理由で、とか言う 感…
let 式 どこでも変数を束縛できる let 式が作る束縛は局所的でガード間で共有されない パターンマッチが使える 例 cylinder :: Double -> Double -> Double cylinder r h = let sideArea = 2 * pi * r * h topArea = pi * r ^ 2 in sideArea + 2 * topArea l…
パート10までやってきた自分えらい ガード 引数の構造で場合分け パターンマッチを使う 引数の値が満たす性質で場合分け ガードを使う 例 bmiTell :: Double -> String bmiTell bmi | bmi <= 18.5 = "You're underweight, you emo, you!" | bmi <= 25.0 = "Y…
やっていきのこころ パターンマッチ パターンに従ってデータを分解するときに使う luckey :: Int -> String luckey 7 = "Luckey!!!" luckey x = "Unluckey!!!" パターンが上から下の順で評価される パターンが合致するとそのパターンの本体が実行される *Mai…