計算機科学のブログ

関数型プログラミングの基礎 - 高階関数 - 関数(filter, length, elem, map, sum)、回文、調和級数、遅延許価

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)の UNIT1(関数型プログラミングの基礎)、LESSON 9(高階関数)、9.6(練習問題)、Q9-1の解答を求めてみる。

コード

sample.hs

import Data.Char (toLower)
main :: IO ()
main = do
    print "-----"
    print $ elem 1 []
    print $ elem 1 [1]
    print $ elem 1 [2]
    print $ elem 1 [1, 2]
    print $ elem 1 [2, 3]
    print "-----"
    print $ myElem 1 []
    print $ myElem 1 [1]
    print $ myElem 1 [2]
    print $ myElem 1 [1, 2]
    print $ myElem 1 [2, 3]
    print "-----"
    print $ isPalindrome "A man a plan a canal Panama"
    print $ isPalindrome "ab" 
    print "-----"
    print $ harmonic 1
    print $ harmonic 2
    print $ harmonic 3
    print $ harmonic 4
    print $ harmonic 5
    print $ harmonic 100



-- Q9-1
myElem :: Eq a => a -> [a] -> Bool
myElem x xs = length (filter (== x) xs) /= 0 

-- Q9-2
isPalindrome :: [Char] -> Bool
isPalindrome x = 
    let y = map toLower (filter (/= ' ') x)
    in y == reverse y

-- Q9-3
harmonic :: (Fractional a, Enum a) => Int -> a
harmonic n = sum $ take n (map (1 /) [1, 2 ..])

入出力結果(Terminal, Zsh)

% runghc sample.hs
"-----"
False
True
False
True
False
"-----"
False
True
False
True
False
"-----"
True
False
"-----"
1.0
1.5
1.8333333333333333
2.083333333333333
2.283333333333333
5.187377517639621
$