IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

2014-02-01から1ヶ月間の記事一覧

Haskellのコードを左から読むとき右から読むとき

-- 合成関数の場合、右から読む。 Prelude> ( (+1) . (*3) ) 4 13 Prelude> -- Control.Arrowを使ってみる -- >>>は左から読む。シェルのパイプをつなげるように。 Prelude> :m Control.Arrow Prelude Control.Arrow> ( (+1) >>> (*3) ) 4 15 -- <<<は右から…

Haskellでの集合演算は簡単だけどpreludeの場合少し嵌る

http://hackage.haskell.org/package/base-4.6.0.1/docs/Data-List.html の "Set" operations を参照しました。 -- 和 Prelude> Data.List.union [1,2,3] [3,4,5] [1,2,3,4,5] -- 積 Prelude> Data.List.intersect [1,2,3] [3,4,5] [3] -- 差 Prelude> Data.…

99 questions/Solutions/31の回答の作り方(よくない例)

試行錯誤の履歴です。もっとうまい試行錯誤の方法があるはず。。 -- 2から10までの配列を作る Prelude> ( \x -> [2..x] ) 10 [2,3,4,5,6,7,8,9,10] -- 作った配列に対して、なんらかの関数を適用してみる。 -- filterを使うつもりだが、まずは結果が分かりや…

再帰でのletとinが読み熟せない

99 problems 20より別解として下記が示されていました。 removeAt :: Int -> [a] -> (Maybe a, [a]) removeAt _ [] = (Nothing, []) removeAt 1 (x:xs) = (Just x, xs) removeAt k (x:xs) = let (a, r) = removeAt (k - 1) xs in (a, x:r) 再帰しているので…

Haskellの2種類の割り算

-- 割り算結果は小数部分込み Prelude> 7 / 2 3.5 Prelude> :t 7 / 2 7 / 2 :: Fractional a => a --割り算結果は整数扱い Prelude> 7 `div` 2 3 Prelude> :t 7 `div` 2 7 `div` 2 :: Integral a => a -- drop の第一引数の型は int のため下記はエラーとな…

haskellの型推論わからん

99 problemsのquestion 9の回答をみたら、span関数がありました。http://www.haskell.org/hoogle/?hoogle=span Prelude> :t span span :: (a -> Bool) -> [a] -> ([a], [a]) 第一引数は関数なので、適当にidを渡してみたところ、こうなりました。 Prelude> :…

関数適用は最優先 (99 questions problem 8 より)

回答は、下記なのですが、理解に苦しみました。 compress :: Eq a => [a] -> [a] compress = map head . group mapを使ってリストの要素に対してhead . group をする意味が分かりませんでした。 map head . group [1,1,2,2,3] とあったときにリストの要素0番…

モナドが消える

99 questions の6問目の別解が難しい。 Prelude> Control.Monad.liftM2 (==) id reverse [1,2,3,2,1] True Prelude> Control.Monad.liftM2 (==) id reverse [1,2,3,2,4] False Prelude> となっています。次のように型を確認すると、 (1) Prelude> :t Control…

99 questions problem 3

リストの要素を1始まりで取得する関数の作成で、NG場合。 *Main> last $ take 1 ['a','b','c','d','e'] 'a' *Main> last $ take 2 ['a','b','c','d','e'] 'b' *Main> last $ take 3 ['a','b','c','d','e'] 'c' *Main> last $ take 4 ['a','b','c','d','e'] '…

関数適用は最優先

下記のコンパイルエラーには嵌りました。 *Main> let foo xs = last .init sx <interactive>:326:25: Not in scope: `sx' Perhaps you meant `xs' (line 326) *Main> これは、 last . (init sx) と解釈されているからでしょう。関数合成してる部分を括弧に囲むとエラーに</interactive>…

const id

const id は第2引数を返します。その理由がわかりませんでした。 *Main> :t const id const id :: b -> a -> a *Main> const id 1 2 2 理由を説明した Webページをいくつか読みましたが、それでも理解できず(x_x;)。 基本に立ち返ると、次の2つを理解して…