by shigemk2

当面は技術的なことしか書かない

Haskell

今日やったこと #ikebin

挿入ソートのHaskell実装の流れ pic.twitter.com/Tuv8Gon9AR— 炭鉱ハッカー shigemk2 (@shigemk2) 2014, 10月 25 バブルソート マージソート バブルソートを再帰で実装していた。Haskellで。 Haskell難しい。再帰も難しい。 作ってみたやつ。 bsort-debug2.h…

FedoraでHaskell環境を構築するための手順(Emacsも) #hs_abc

久々でした 環境 Fedora 20 Emacs 24.3.1 参考サイト Haskell IDE Leksah 入門 - Qiita GHCによるHaskellの3つの実行方法とHello World - Cutting-Edge Programming MacOSX - EmacsでHaskellプログラミングするための環境構築手順(haskell-mode.elの導入) - …

再帰的なデータ構造

-- 代数データ型の値コンストラクタは複数のフィールドを持つことも出来るし、 -- フィールドを持たないことも出来るお -- 各フィールドの型は具体型である必要はある。 -- そして、フィールドに持つ型は自分自身でもかまわない。 infixr 5 :-: -- 結合性 da…

構文糖衣

人間にとってより読みやすく書かれた構文のこと。死荷重損失ばりになんかアレな和訳なので、普通にsyntax sugarでいいんじゃないかと思っている。 Prelude> 5:[] [5] Prelude> 3:(4:(5:6:[])) [3,4,5,6] Prelude> 3:4:5:6:[] [3,4,5,6]

型シノニム

[Char] と Stringは同値で、交換可能である。 これは型シノニム(型同義名)を使って実装されている -- ロッカーが埋まっているか空いているかを表す新しいデータ型 -- LockerStateを導入。また、ロッカーの暗証番号には型シノニムCodeを与えた。 -- さらに整…

自動導出4 曜日

data Day = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday deriving (Eq, Ord, Show, Read, Bounded, Enum) -- *Main> Wednesday -- Wednesday -- *Main> show Wednesday -- "Wednesday" -- *Main> read "Saturday" :: Day -- Satu…

自動導出3 順番

-- Ordのインスタンスも自動導出が出来る -- 2つの値が同じ値コンストラクタで出来ている場合、フィールドがなければ -- 2つは等しいとされる。フィールドがあれば、フィールド同士が比較され、 -- どっちが大きいか決まる(そのときフィールドの型もOrdに属…

自動導出 2

data Person = Person { firstName :: String , lastName :: String , age :: Int } deriving (Eq, Show, Read) mikeK = Person {firstName = "Michael", lastName = "Karoli", age = 53} holgerC = Person {firstName = "Holger", lastName = "Czukay", age…

自動導出

Haskellは、特定の型クラスのインスタンス宣言を自動導出(derive)する能力を備えている。 自動導出出来る型クラスは、Eq Ord Enum Bounded Show Readである。 自作のデータ型を作るとき、derivingキーワードを使えば、Haskellがこれらの型クラスの文脈で振る…

三次元ベクトルの計算

値コンストラクタ≠型コンストラクタ data Vector a = Vector a a a deriving (Show) -- Vector a a a -> Vector a a a -> a は間違い vplus :: (Num a) => Vector a -> Vector a -> Vector a (Vector i j k) `vplus` (Vector l m n) = Vector (i+l) (j+m) (k…

レコード構文

data Person = Person String String Int Float String String deriving (Show) -- *Main> let guy = Person "Buddy" "Finklestein" 43 184.2 "526-2928" "Chocolate" -- *Main> guy -- Person "Buddy" "Finklestein" 43 184.2 "526-2928" "Chocolate" first…

自作のデータ型を自作のモジュールからエクスポートする

module Shapes ( Point, Shape, area, nudge, baseCircle, baseRect ) where data Point = Point Float Float deriving (Show) data Shape = Circle Point Float | Rectangle Point Point deriving (Show) area :: Shape -> Float area (Circle _ r) = pi * …

Pointデータ型で形を整える

-- 空間の点を表す中間データ構造を作る -- そうするともっと図形をもっとわかりやすくできるお data Point = Point Float Float deriving (Show) data Shape = Circle Point Float | Rectangle Point Point deriving (Show) area :: Shape -> Float area (C…

値コンストラクタ

haskellでは、データ型を自作することが可能である。 例を見てみよう。 -- Circle側コンストラクタには、浮動小数を受け取るフィールドが3つある -- このように、値コンストラクタを書くときは後ろに型をつけたすことが出来、 -- これらは値コンストラクタに…

モジュールの自作

このようにモジュールを自作することが出来る。 -- インポートしたい関数群 -- rectAreaがないことに注意。 -- つまり全ての関数をインポートする必要はない。 module Geometry ( sphereVolume, sphereArea, cubeVolume, cubeArea, cuboidArea, cuboidVolume…

キーから値へのマッピング

phoneBook = [("betty", "555-2938"), ("honnie", "555-2222"), ("party", "333-1111"), ("hyper", "999-3838"), ("wendy", "222-1212"), ("penny", "888-8888")] -- キーとリストを受け取り、キーに合致するもののみをフィルタで残して、 -- 最初のキー/値…

標準モジュールの関数で問題を解く

標準 import Data.List import Data.Char -- import qualified Data.Map as M wordNums :: String -> [(String,Int)] wordNums = map (\ws -> (head ws, length ws)) . group. sort . words isIn :: (Eq a) => [a] -> [a] -> Bool needle `isIn` haystack = …

モジュールのインポート

importを使うと、モジュールをインポートできる。 ()で使いたいメソッドの指定も可能。 import Data.List (nub, sort, group) -- import qualified Data.Map as M numUniques :: (Eq a) => [a] -> Int numUniques = length . nub wordNums :: String -> [(St…

nub

Haskell : nubremoves duplicates elements from a list. Main > nub [1,2,3,2,1] [1,2,3] Main > nub "AAAABBBBBBBBBBBCCCC" "ABC"

ポイントフリースタイル

関数合成 - by shigemk2関数合成の別の使い方 ポイントとは、fn x = f (g x)のような関数定義に登場する一時変数xのことである。 このポイントを使わないで関数を定義するスタイルなので、 ポイントフリースタイルと呼ばれる。 fn = ceiling . negate . tan …

関数合成

まず1つの関数を呼び出し、それからもう1つの関数にその結果を渡して呼び出したものに 等しい。ただ、簡単に利用できるわけではなく、たとえば以下のように定義しなければならない (すみません、僕の環境では>.>だとAmbiguous occurrenceなるエラーが出てし…

畳み込み

Haskellには、畳み込み(fold)という機能があるの。畳み込みを使うと、データ構造(たとえばリスト)を単一の値に纏めることができる。 畳み込み関数は2つの引数を取る関数であり、畳み込みに用いる値(アキュムレータ)の初期値、畳み込むリストを受けとる。リス…

ラムダ

-- ラムダ式とは、1回だけ必要な関数を作るときに使う無名関数である。 -- 通常ラムダ式は高階関数に渡す関数を作るためだけに使われる。 -- ラムダ式を宣言するためには、バックスラッシュを書いて、それから関数の引数を -- スペース区切りで書く numLongC…

関数プログラマの道具箱

-- 関数プログラマがたった1つの値に対する演算をしたいことはない。 -- たいていは、数や文字や他の型のデータの集まりを受け取り、その集合を -- 変換して結果を得たいものである。 -- 関数とリストを受け取り、その関数をリストのすべての要素に適用する …

高階実演

関数を受け取り、それを2回適用する。 -- 関数を2回適用する applyTwice :: (a -> a) -> a -> a applyTwice f x = f (f x) -- 関数と2つのリストを引数に取り、2つのリストの各要素にその関数を適用し、2つのリストを1つに結合する zipWith' :: (a -> b -> c…

部分適用とセクション

Haskellの関数は部分適用を利用しているつまり、関数を本来より少ない引数で呼び出しているのだ。 また、中置関数についても、セクションという機能を使って部分適用することが出来る。 中置関数をセクションするには、片側だけに値を置いて括弧で囲むだけで…

カリー化関数

Haskellのすべての関数は、公式には引数を1つだけ取ることになっているが、複数の引数も取れるように見える。複数の引数を受け取れるかのように見えた関数は、実は全てカリー化された関数だったのだ。カリー化関数とは、複数の引数を取る代わりに、常にちょ…

再帰

引数が空や、マイナスなど、想定外の値のときの結果を考慮しつつ、 再帰を行う。 -- リストのtail部分を引数として再帰を行う maximum' :: (Ord a) => [a] -> a maximum' [] = error "maximum of empty list" maximum' [x] = x maximum' (x:xs) = max x (max…

case

caseそのものについては説明不要ですけど、 書き方はこんな感じ。 case expression of pattern -> result pattern -> result pattern -> result ... 例によって、どのパターンにも引っかからなかったら、ランタイムエラーが発生する。 head'' :: [a] -> a he…

let

let 式は where 節にとてもよく似ている。 where は関数の終わりで変数を束縛し、 その変数はガードを含む関数全体から見える。それに対し、let式は、どこでも変数を束縛でき、そしてlet自身も式になる。しかし let 式が作る束縛は局所的で、ガード間で共有…