紙媒体で知識や経験を管理すると無くなりがちなのでブログで管理することにしました.
      殆どの記事は自分自身のためだけに書いているため,他人に見せる前提の内容, 文章ではありません.
      また, ブログのコメント欄を解放していたらbotからの迷惑行為を受けたため現在コメント欄は解放しておりません.

haskell

【Haskell】 whereブロック内の関数

これまではwhere内は変数を定義してきたが, 関数も定義できる. calcBmis :: [(Double, Double)] -> [Double] calcBmis xs = [bmi w h | (w,h) <- xs] where bmi weight height = weight / height^2 これは入力は[(Double,Double)]型より, Double型のペアのリ…

【Haskell】 whereの中でパターンマッチを用いる

initials :: String -> String -> String initials firsname lastname = [f] ++ ". " ++ [l] ++ "." where (f:_) = firstname (l:_) = lastname initialという関数はString型の引数を2つとる. firstnameとlastnameをとって, whereの中でパターンマッチにより…

【Haskell】 比較関数を独自定義

myCompare :: (Ord a) => a -> a -> Ordering a `myCompare` b | a == b = EQ | a <= b = LT | otherwise = GT max' :: (Ord a) => a -> a -> a max' a b | a <= b = b | otherwise = a GHCiで:l *.hsで実行する. Prelude> :l sample.hs [1 of 1] Compiling …

【Haskell】 asパターン

asパターンは値をパターンに分解しつつ, パターンマチ位の対象となった値自体も参照できる. xs@(x:y:ys)はx:y:ysと合致するものと同じものと合致しつつ, xsで元のリストそのものにもアクセスできる. firstElement :: String -> String firstElement "" = "em…

【Haskell】 head関数の独自定義

head' :: [a] -> a head' [] = error "Can't call head on an empty list, dummy!" head' (x:_) = x

【Haskell】 リストのパターンマッチとリスト内包表記

let xs = [(1,3), (4,3), (2,4), (5,3), (5,6), (3,1)] [a+b | (a,b) <- xs] -- [4, 7, 6, 8, 11, 4] [x*100+3 | (x,3) <- xs] -- [103, 403, 503]

【Haskell】 型同士の演算

:t (*) (*) :: Num a => a -> a -> a これは2つの同じ型を引数にとって, 1つの同じ型を出力として返すということ. つまりIntとInteger, Floatなど一見同じ数値でも違う型同士の演算は出来ない.length は length :: [a] -> Int という定義のため, 例えば2.8の…

【Haskell】 型変数

リストに対して働く関数headについて型変数を調べると :t head head :: [a] -> a となる. このaはIntやCharなど全ての型をとれるという意味. :t fst fst :: (a,b) -> a これはタプル(a,b)を引数にとり, 最初の要素を返すという意味.

【Haskell】 関数の型の意味

[Char] -> [Char]はひとつの文字列を引数として受け取り, 出力として別の文字列を返すという意味. removeNonUppercase :: [Char] -> [Char] removeNonUppercase st = [ c | c <- st, c `elem` ['A'..'Z']] Int -> Int -> Int -> Intは3つの整数を受け取って,…

【Haskell】直角三角形を見つける

条件は 3辺の長さは整数 各辺の長さは10以下([1..10]) 周囲の長さは24(a+b+c == 24) cを斜辺とすると, aはcよりも小さいのでcの長さ以下のみをaの探索範囲とすればよい. またbを同じ条件で探索してしまうと, aと重複して探索してしまうため, b let rightTria…

【Haskell】 zip関数を使う

zip関数は2つのリストを受け取り, 1つのリストにする. Haskellは遅延評価のため, zip関数によって生成されるリストは入力の短い方のリストの長さと等しい. > zip [1,2,3,4] [3,2,1] [(1,3), (2,2), (3,1)] -- 番号付けに便利 > zip [1..] ["apple", "orange…

【Haskell】ペアを用いる

2つの要素を持つタプルをペアという. fst, sndで1番目, 2番目の要素を取り出せる > fst (1, 3) 1 > snd ("A", "B") "B"

【Haskell】リスト内包表記を使ってlength関数を独自定義

length` xs = sum [1 | _ <- xs]

【Haskell】リスト内包表記

-- 1-10の整数で3倍したものが15を越す整数を3倍したもののリストを得る >[x*3 | x <- [1..10], x*3 > 15] [19,21,24,27,30] -- 50-100までの整数のうち7で割ったあまりが3である全ての整数のリストを得る > [x | x <- [50..100], x `mod` 7 == 3] [52,59,66…

【Haskell】 無限リストの生成

-- cycleはリストを受取, そのリストを無限に連結していく > take 10 (cycle [1,2,3]) [1,2,3,1,2,3,1,2,3,1] > take 11 (cycle "WTF ") "WTF WTF WTF" -- repeatは一つの要素を受取, それを無限に繰り返すリストをつくる > take 5 (repeat 1) [1,1,1,1,1] -…

【Haskell】 リスト生成

単純なリスト生成 -- 数値(ステップ=2) > [2,4..10] [2,4,6,8,10] -- 文字 > ['a'..'d'] "abcd" 無限リストを用いた遅延評価による生成 > take 10 [23,46..] Haskellは遅延評価なのでリスト全体をすぐに評価しない. 最初の10個までしか生成しない.

【Haskell】 リスト操作

> let a = [1,2,3,4] -- リストの先頭の要素を取得する > head a 1 -- リストの先頭を取り外したリストを取得する > tail a [2,3,4] -- リストの最後の要素を取得する > last a 4 -- リストの最後の要素を取り除いた残りの要素を取得する(⇔tail) > init a [1…

【Haskell】 リスト同士の比較

リスト同士の比較のアルゴリズムはリストAとリストBについて, 始めの要素から比較していき 始めて演算が評価される要素によってTrueかFalseが返される. -- 1番目, 2番目は同じ大きさ, 3番目の要素で評価される > [3,2,4] > [3,2,1] -- 3>2より左辺が大きい >…

【Haskell】 リストの連結

-- 名前の宣言 > let a = [1,2,3] > a ++ [3,4,5] [1,2,3,3,4,5] -- リストの連結は ++ 演算子を用いる > 1 : [2,3,4] [1,2,3,4] -- cons演算子を用いるとリストの先頭にリストの要素の型と同じ型のものを入れられる > ['h','e'] ++ ['l','l','o'] "helloo" …

【haskell】 関数の約束事

・Haskellの関数は大文字で始めなければならない. ・引数をひとつもとらない関数のことを定義, 名前と呼ぶ.

【haskell】 条件分岐を含んだ関数

doubleSmallNumber x = if x > 100 then x else x * 2 -- 条件分岐の構文はif 条件 then (Trueの場合の返り値) else (Falseの場合の返り値) schemeなどと同じくelse節が必須 haskellのプログラムは関数の集まりで全ての関数は何らかの値を返すという考え. if…

【haskell】 関数 例

-- 自身を2倍する関数 doubleMe x = x * 2 -- 2倍してから足し合わせる関数 doubleUs x y = x * 2 + y * 2

【haskell】 : の意味

schemeやLISPで言うところのconsの役割だそう >1 : [2] [1, 2] >1 : 2 : [3..5] [1, 2, 3, 4, 5]

【haskell】zipWith

【参考】 ・http://zvon.org/other/haskell/Outputprelude/zipWith_f.html

【haskell】 takeWhile

takeWhile (<=3) [1..10] -- [1,2,3] 【参考】 ・http://zvon.org/other/haskell/Outputprelude/takeWhile_f.html

【haskell】リストの生成

[x | x <- [1..100]] [1:100](100を含む)リストが生成される. [x | x <- [1..100], even x] , で条件をつけることができる.