Haskell

RWH 4章練習問題

休みに入ったので、その間に少しでもRWH読もう。 -- 6 groupBy_fold :: (a -> a -> Bool) -> [a] -> [[a]] groupBy_fold f xs = foldl' step [] xs where step acc y | null acc = [[y]] | f (head $ last acc) y = init acc ++ [ (last acc) ++ [y] ] | oth…

RWH 4.6 練習問題

-- 4 concat_foldr :: [[a]] -> [a] concat_foldr xs = foldr (++) [] xs -- 5 takeWhile_foldr :: (a -> Bool) -> [a] -> [a] takeWhile_foldr f xs = foldr step [] xs where step x ys | f x = x: ys | otherwise = [] 明示的な再帰を使ったtakeWhileは省…

RWH 4.6 練習問題

2の一番下の例はパッと思いつかなかった。 -- 2 asInt_fold :: String -> Int asInt_fold xs | null xs = error "empty list" | xs == "-" = error "minus sign only" | '.' `elem` xs = error "floating point" | head xs == '-' = negate $ fold $ tail xs…

RWH p.102 練習問題

1だけ。 import Data.Char (digitToInt) import Data.List (foldl') asInt_fold xs | head xs == '-' = negate $ fold $ tail xs | otherwise = fold xs where fold xs = foldl' step 0 xs step acc x = 10 * acc + digitToInt x foldl, foldrはまだよくわか…

RWH p.92 練習問題 3

import System.Environment (getArgs) interactWith function inputFile outputFile = do input <- readFile inputFile writeFile outputFile (function input) main = mainWith myFunction where mainWith function = do args <- getArgs case args of [inp…

RWH p.92 練習問題 1, 2

-- 1 safeHead :: [a] -> Maybe a safeHead [] = Nothing safeHead (x:_) = Just x safeTail :: [a] -> Maybe [a] safeTail [] = Nothing safeTail (_:xs) = Just xs safeLast :: [a] -> Maybe a safeLast [] = Nothing safeLast xs = Just $ myLast xs safe…

RWH 4.5.8 文字列専用の関数

import Data.Char (isSpace) myLines :: String -> [String] myLines [] = [] myLines cs = let (pre, suf) = myBreak (\c -> c == '\n') cs in pre : case suf of ('\n':rest) -> myLines rest _ -> [] myUnlines :: [String] -> String myUnlines [] = "\n…

RWH 4.5.7 一度に複数のリストを使う

myZip :: [a] -> [b] -> [(a,b)] myZip [] _ = [] myZip _ [] = [] myZip (x:xs) (y:ys) = (x,y):(myZip xs ys) myZipWith :: (a -> b -> c) -> [a] -> [b] -> [c] myZipWith _ [] _ = [] myZipWith _ _ [] = [] myZipWith f (x:xs) (y:ys) = f x y:(myZipWi…

RWH 4.5.6 リストの探索

myElem :: (Eq a) => a -> [a] -> Bool myElem _ [] = False myElem e (x:xs) | e == x = True | otherwise = myElem e xs myNotElem :: (Eq a) => a -> [a] -> Bool myNotElem e = not . myElem e myFilter :: (a -> Bool) -> [a] -> [a] myFilter _ [] = […

RWH 4.5.5 部分リストを使う

myTake :: Int -> [a] -> [a] myTake _ [] = [] myTake n (x:xs) | n > 0 = x : (myTake (n - 1) xs) | otherwise = [] myDrop :: Int -> [a] -> [a] myDrop _ [] = [] myDrop n (x:xs) | n > 0 = myDrop (n - 1) xs | otherwise = x:xs mySplitAt :: Int ->…

RWH 4.5.1, 4.5.4

-- 4.5.1 基本的なリストの処理 myLength :: [a] -> Int myLength [] = 0 myLength (_:xs) = 1 + myLength xs myNull :: [a] -> Bool myNull [] = True myNull _ = False myHead :: [a] -> a myHead (x:_) = x myHead [] = error "empty list" myTail :: [a]…

RWH 3章章末

-- 3 avg :: (Fractional a) => [a] -> a avg [] = 0 avg xs = sum xs / fromIntegral (length xs) -- 4 palindrome :: [a] -> [a] palindrome xs = xs ++ reverse xs -- 5 isPalindrome :: (Eq a) => [a] -> Bool isPalindrome xs = xs == (reverse xs) -- …

RWH

3章の章末練習問題。1だけ。型シグネチャもつけたから2もだけど。 myLength :: [a] -> Int myLength [] = 0 myLength (_:xs) = 1 + myLength xs

RWH

3.8まで読んだ。3.7のあとの練習問題は、2がどうもうまく解けてない気がしてならないなぁ。もう少し考えてみよう。 toList :: List a -> [a] -- toList (Cons x xs) = (:) x (toList xs) toList (x `Cons` xs) = (:) x (toList xs) toList Nil = [] 1は同型…

toBool

toBool :: Num a => a -> Bool toBool = (/= 0) Foreign.Marshal.Utils

ふつける

ふつける9章から再読。このあたりからついていきにくいです。10章はだいたい理解できるから読み飛ばしてもいいかな。

今日もふつける

ふつけるを読み進めてます。代数的データ型とか型クラスとかモナドとかさっぱりわかんないです。あとでゆっくり読み直さないとね。

map関数

ふつけるのmap関数やfilter関数の説明を読んで、やっとPerlのmap関数とかgrep関数の動作が理解できた気がします。まだまだ理解が足りないとも思うけど。私には高階関数の概念が欠けてたんだね。