Real World Haskell 3章 練習問題 1〜8

1.リストの要素数を数える関数
myLength [] = 0
myLenght (x:xs) = 1 + (myLength xs)
2.型シグネチャをつける

ghciで:tするだけ。

myLength :: [a] -> Int
myLength [] = 0
myLenght (x:xs) = 1 + (myLength xs)
3.リストの平均
mean :: Fractional a => [a] -> a
mean [] = 0
mean xs = (sum xs) / (fromIntegral $ length xs)
4.リストを回文に (ex. [1,2,3] -> [1,2,3,3,2,1])
palindrome :: [a] -> [a]
palindrome xs = xs ++ (reverse xs)
5.回文かどうか判定
isPalindrome :: Eq a => [a] -> Bool
isPalindrome xs = xs == reverse xs
6.リストのリストをサブリストの長さでソート(Data.ListモジュールのsortByを参考にして)

sortByを実装しろとか言われたらちょっと分からない。できる人はすぐできるんだろうけど。

import Data.List
sortByLengthOfList :: [[a]] -> [[a]]
sortByLengthOfList xs = sortBy compare xs
    where compare a b | length a >= length b = GT
                      | length a < length b = LT
7.区切りになる値でリストのリストを連結
intersperse :: a -> [[a]] -> [a]
intersperse _ [] = []
intersperse _ [xs] = xs
intersperse sep (xs:xss) = xs ++ [sep] ++ intersperse sep xss
8.二分木の高さ
data Tree a = Node a (Tree a) (Tree a)
            | Empty
              deriving (Show)

t = Node "x" Empty (Node "y" Empty Empty)

treeHeight Empty = 0
treeHeight (Node root left right) =
              1 + max (treeHeight left) (treeHeight right)

問題9〜12は幾何学の問題。この分野は得意じゃないのでちょっと勉強する。