2013年2月5日火曜日

開発環境

Real World Haskell』(Bryan O'SullivanJohn GoerzenDon Stewart(著)、山下 伸夫伊東 勝利株式会社タイムインターメディア(翻訳)、オライリー・ジャパン、2009年、ISBN978-4-87311-423-3)の3章(型を定義し、関数を単純化する)の3.13(ガード条件節の評価)の練習問題5.を解いてみる。

5.

コード(BBEdit)

Sample.hs

-- file: sample.hs

kaibun :: [a] -> [a]
--isKaibun :: [a] -> Bool
-- 上記だとエラーになった。試しに関数の型の定義をしないで実行したら上手くいった。
-- :type で型を調べてみたら、以下のようになっていた。「==」を使うためにいるみたい。
-- たぶんまだ出てきてないけど、この先でてくるのかな。
-- 既知の知識だけで、「==」を使わないで済む方法を考えてみたけど思いつかず。。
isKaibun :: Eq a => [a] -> Bool

kaibun [] = []
kaibun (x:xs) = x : kaibun xs ++ [x]

isKaibun []     = True
isKaibun (_:[]) = False
isKaibun (x:xs) = x == last xs && isKaibun a
    where a = take (length xs - 1) xs

入出力結果(Terminal)

$ ghci
GHCi, version 7.4.2: 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> :load Sample.hs
[1 of 1] Compiling Main             ( Sample.hs, interpreted )

Sample.hs:12:21:
    No instance for (Eq a)
      arising from a use of `=='
    In the first argument of `(&&)', namely `x == last xs'
    In the expression: x == last xs && isKaibun a
    In an equation for `isKaibun':
        isKaibun (x : xs)
          = x == last xs && isKaibun a
          where
              a = take (length xs - 1) xs
Failed, modules loaded: none.
Prelude> :load Sample.hs
[1 of 1] Compiling Main             ( Sample.hs, interpreted )
Ok, modules loaded: Main.
*Main> :type isKaibun
isKaibun :: Eq a => [a] -> Bool
*Main> :load Sample.hs
[1 of 1] Compiling Main             ( Sample.hs, interpreted )
Ok, modules loaded: Main.
*Main> kaibun [1,2,3,4,5]
[1,2,3,4,5,5,4,3,2,1]
*Main> isKaibun it
True
*Main> kaibun "haskell"
"haskelllleksah"
*Main> isKaibun it
True
*Main> isKaibun [1,2,3,2,1]
False
*Main> isKaibun [1,2,3,4,5]
False
*Main> isKaibun "abba"
True
*Main> isKaibun []
True
*Main> kaibun []
[]
*Main> isKaibun [1]
False
*Main> isKaibun 1

<interactive>:16:10:
    No instance for (Num [a0])
      arising from the literal `1'
    Possible fix: add an instance declaration for (Num [a0])
    In the first argument of `isKaibun', namely `1'
    In the expression: isKaibun 1
    In an equation for `it': it = isKaibun 1
*Main> isKaibun "a"
False
*Main> isKaibun "abba"
True
*Main> :quit
Leaving GHCi.
$

0 コメント:

コメントを投稿