Real World Haskell
実戦で学ぶ関数型言語プログラミング
(オライリージャパン)
Bryan O'Sullivan (著) John Goerzen (著)
Don Stewart (著)
山下 伸夫 (翻訳) 伊東 勝利 (翻訳)
株式会社タイムインターメディア (翻訳)
開発環境
- OS X Mavericks - Apple(OS)
- BBEdit - Bare Bones Software, Inc., Emacs (Text Editor)
- Haskell (純粋関数型プログラミング言語)
- GHC (The Glasgow Haskell Compiler) (処理系)
- The Haskell Platform (インストール方法、モジュール等)
Real World Haskell―実戦で学ぶ関数型言語プログラミング(Bryan O'Sullivan (著)、 John Goerzen (著)、 Don Stewart (著)、山下 伸夫 (翻訳)、伊東 勝利 (翻訳)、株式会社タイムインターメディア (翻訳)、オライリージャパン)の6章(型クラスを使う)、6.9(重複インスタンスのないJSON型クラス)、5.13.3(プリティプリンタを追いかける)、練習問題 1.を解いてみる。
その他参考書籍
- すごいHaskellたのしく学ぼう!(オーム社) Miran Lipovača(著)、田中 英行、村主 崇行(翻訳)
- プログラミングHaskell (オーム社) Graham Hutton(著) 山本 和彦(翻訳)
練習問題 1.
コード(BBEdit, Emacs)
JSONClass.hs
{-# OPTIONS -Wall -Werror #-}
module JSONClass ( JValue
, JObj(..)
, JAry(..)) where
--import Control.Arrow (second)
data JValue = JString String
| JNumber Double
| JBool Bool
| JNull
| JObject (JObj JValue)
| JArray (JAry JValue)
deriving (Eq, Ord, Show)
newtype JObj a = JObj {fromJObj :: [(String, a)]} deriving (Eq, Ord, Show)
newtype JAry a = JAry {fromJAry :: [a]} deriving (Eq, Ord, Show)
type JSONError = String
class JSON a where
toJValue :: a -> JValue
fromJValue :: JValue -> Either JSONError a
instance JSON JValue where
toJValue = id
fromJValue = Right
instance (JSON a) => JSON (JAry a) where
toJValue = JArray . JAry . map toJValue . fromJAry
fromJValue = undefined
Control.Arrowモジュールのsecond関数を調べたり、使ったりしてみる。
入出力結果(Terminal, インタプリタghci)
$ ghci
GHCi, version 7.6.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :module +Control.Arrow
Prelude Control.Arrow> :t second
second :: Arrow a => a b c -> a (d, b) (d, c)
Prelude Control.Arrow> :info second
class Control.Category.Category a => Arrow a where
...
second :: a b c -> a (d, b) (d, c)
...
-- Defined in `Control.Arrow'
Prelude Control.Arrow> :load JSONClass.hs
[1 of 1] Compiling JSONClass ( JSONClass.hs, interpreted )
Ok, modules loaded: JSONClass.
*JSONClass Control.Arrow> :info Arrow
class Control.Category.Category a => Arrow a where
arr :: (b -> c) -> a b c
first :: a b c -> a (b, d) (c, d)
second :: a b c -> a (d, b) (d, c)
(***) :: a b c -> a b' c' -> a (b, b') (c, c')
(&&&) :: a b c -> a b c' -> a b (c, c')
-- Defined in `Control.Arrow'
instance Arrow (->) -- Defined in `Control.Arrow'
*JSONClass Control.Arrow> :t second toJValue
second toJValue :: JSON a => (d, a) -> (d, JValue)
*JSONClass Control.Arrow> :info second toJValue
class Control.Category.Category a => Arrow a where
...
second :: a b c -> a (d, b) (d, c)
...
-- Defined in `Control.Arrow'
class JSON a where
toJValue :: a -> JValue
...
-- Defined at JSONClass.hs:23:5
*JSONClass Control.Arrow> :info (->)
data (->) a b -- Defined in `GHC.Prim'
instance Monad ((->) r) -- Defined in `GHC.Base'
instance Functor ((->) r) -- Defined in `GHC.Base'
instance ArrowLoop (->) -- Defined in `Control.Arrow'
instance ArrowChoice (->) -- Defined in `Control.Arrow'
instance ArrowApply (->) -- Defined in `Control.Arrow'
instance Arrow (->) -- Defined in `Control.Arrow'
*JSONClass Control.Arrow> :kind (->)
(->) :: * -> * -> *
*JSONClass Control.Arrow> let x = JAry [JString "Hskell", JNumber 1, JBool True, JNull]
*JSONClass Control.Arrow> :set +t
*JSONClass Control.Arrow> x
JAry {fromJAry = [JString "Hskell",JNumber 1.0,JBool True,JNull]}
it :: JAry JValue
*JSONClass Control.Arrow> (second toJValue) ("Haksell", x)
("Haksell",JArray (JAry {fromJAry = [JString "Hskell",JNumber 1.0,JBool True,JNull]}))
it :: ([Char], JValue)
*JSONClass Control.Arrow> :t ("Haksell", x)
("Haksell", x) :: ([Char], JAry JValue)
*JSONClass Control.Arrow> :quit
Leaving GHCi.
$
0 コメント:
コメントを投稿