2013年12月18日水曜日

開発環境

C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)のⅢ部(高度なプログラミング概念)の17章(高度なポインタ)、17-12(プログラミング実習)、実習17-2.をHaskellで解いてみる。

その他参考書籍

17-12(プログラミング実習)、実習17-2.

コード(BBEdit)

Sample.hs

{-# OPTIONS -Wall -Werror #-}

main :: IO ()
main = do
    print langLinkedList
    let langs1 = linkedListRemove "c" langLinkedList
        langs2 = linkedListRemove "python" langs1
        langs3 = linkedListRemove "dart" langs2
        langs4 = linkedListRemove "haskell" . linkedListRemove "scheme" $ langs3
    mapM_ print [langs1, langs2, langs3, langs4]

data LinkedList a = Empty | LinkedList a (LinkedList a) deriving (Show)

mkLinkedList :: a -> LinkedList a
mkLinkedList x = LinkedList x Empty

linkedListAdd :: a -> LinkedList a -> LinkedList a
linkedListAdd x Empty = mkLinkedList x
linkedListAdd x (LinkedList a l) = LinkedList a (linkedListAdd x l)

linkedListRemove :: (Ord a) => a -> LinkedList a -> LinkedList a
linkedListRemove _ Empty = Empty
linkedListRemove x (LinkedList a l) =
    if x == a then l else LinkedList a (linkedListRemove x l)

langLinkedList :: LinkedList String
langLinkedList = foldr LinkedList Empty langs

langs :: [String]
langs = ["python", "c", "scheme", "haskell", "dart"]

入出力結果(Terminal, runghc)

$ runghc Sample.hs
LinkedList "python" (LinkedList "c" (LinkedList "scheme" (LinkedList "haskell" (LinkedList "dart" Empty))))
LinkedList "python" (LinkedList "scheme" (LinkedList "haskell" (LinkedList "dart" Empty)))
LinkedList "scheme" (LinkedList "haskell" (LinkedList "dart" Empty))
LinkedList "scheme" (LinkedList "haskell" Empty)
Empty
$

慣れるまでは{-# OPTIONS -Wall -Werror #-}の記述を消さずに細かく型を指定していくことに。

0 コメント:

コメントを投稿