qoopty の回答履歴

全4件中1~4件表示
  • Haskell: foldrの使用について

    例えば、filterの定義として、 filter :: (a -> Bool) -> [a] -> [a] filter p xs = [x | x <- xs, p x] というのがありますが、foldrを使用すると、 filter :: (a -> Bool) -> [a] -> [a] filter p = foldr (\x xs -> if p x then x : xs else xs) [] として、引数を一個減らして書いた定義ではありますが、 2つとも同じ意味です。 ここで、ふと思ったのですが、ふたつめのfoldrを使用した場合での定義 として、xsとxはどこで、「xsとxはこの部分である」と指定されているでしょうか。例えば、 filter (+) [1,2,3] とすれば、xは1で、xsは[2,3]というのは人間から見てわかりますが、 コンピュータとしてはどう理解しているのでしょうか。 説明がわかりにくいかもしれませんが、 よろしくお願いします。

    • tsuki7
    • 回答数2
  • Haskell: foldrの使用について

    例えば、filterの定義として、 filter :: (a -> Bool) -> [a] -> [a] filter p xs = [x | x <- xs, p x] というのがありますが、foldrを使用すると、 filter :: (a -> Bool) -> [a] -> [a] filter p = foldr (\x xs -> if p x then x : xs else xs) [] として、引数を一個減らして書いた定義ではありますが、 2つとも同じ意味です。 ここで、ふと思ったのですが、ふたつめのfoldrを使用した場合での定義 として、xsとxはどこで、「xsとxはこの部分である」と指定されているでしょうか。例えば、 filter (+) [1,2,3] とすれば、xは1で、xsは[2,3]というのは人間から見てわかりますが、 コンピュータとしてはどう理解しているのでしょうか。 説明がわかりにくいかもしれませんが、 よろしくお願いします。

    • tsuki7
    • 回答数2
  • [Haskell]handle関数がうまくいかない

    RealWorldHaskellという本を読んでいて解決できないところがあったので質問します。 Control.Exceptionには例外を扱うhandle関数というものがあります。 型シグネチャは Exception e => (e -> IO a) -> IO a -> IO a です。 1つ目の引数に例外を捉えた場合実行する関数を、2つ目の引数に例外を投げる可能性のある関数を与えます。 1つ目の引数の関数の返り値の型と2つ目の引数の型は同じでなければなりません。 次の関数はhandle関数を利用して安全にファイルサイズを取得する(つもりで作った)関数です。 getFileSize :: FilePath -> IO (Maybe Integer) getFileSize path = handle (\_ -> return Nothing ) $ bracket (openFile path ReadMode) hClose $ \h -> do size <- hFileSize h return (Just size) この関数がうまくいきません。 具体的に言えばコンパイルすると handle (\_ -> return Nothing ) の部分で Ambiguous type variable `e0' in the constraint: とエラーは吐きます。 しかし、返り値の型はNothingでMaybe Integerと合致していると思います。 なのにAmbiguousです。 なぜこうなるのかわかりません。 ちなみにControl.OldExceptionでもhandle関数が定義されていますが、ghcのバージョンが新しいせいか(7.0.2)コンパイルできません。 なのでControl.Exceptionしか使えません。 よろしくお願いします。

    • puntero
    • 回答数1
  • haskellでの木構造処理でエラー

    「すごいhaskellたのしく学ぼう!」という本でhaskellを勉強している者です。 現在haskellでの木構造の処理について部分を読んでいるんですが、この本のサンプル通りにやってもうまくいきません。 以下がそのサンプルです。 data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Show) data Direction = L | R deriving (Show) type Directions = [Direction] freeTree :: Tree Char freeTree = Node 'P' (Node 'O' (Node 'L' (Node 'N' Empty Empty) (Node 'T' Empty Empty) ) (Node 'Y' (Node 'S' Empty Empty) (Node 'A' Empty Empty) ) ) (Node 'L' (Node 'W' (Node 'C' Empty Empty) (Node 'R' Empty Empty) ) (Node 'A' (Node 'A' Empty Empty) (Node 'C' Empty Empty) ) ) changeToP :: Directions -> Tree Char -> Tree Char changeToP (L:ds) (Node x l r) = Node x (changeToP ds l) r changeToP (R:ds) (Node x l r) = Node x l (changeToP ds r) changeTop [] (Node _ l r) = Node 'P' l r 簡単に説明すると、 changeToP Directions (Tree Char) で Directions に従い木を再帰的に処理し、ノードの文字をPに変更した木を返します。 例えば changeToP [R,L] freeTree とすると Node 'P' (Node 'O' (Node 'L' (Node 'N' Empty Empty) (Node 'T' Empty Empty) ) (Node 'Y' (Node 'S' Empty Empty) (Node 'A' Empty Empty) ) ) (Node 'L' (Node 'P'          -- ここが'W'から'P'に変わります (Node 'C' Empty Empty) (Node 'R' Empty Empty) ) (Node 'A' (Node 'A' Empty Empty) (Node 'C' Empty Empty) ) ) となります('W'が'P'に変わります)。 しかしこれがうまく行きません これをそのまま評価すると Node 'P' (Node 'O' (Node 'L' (Node 'N' Empty Empty) (Node 'T' Empty Empty)) (Node 'Y' (Node 'S' Empty Empty) (Node 'A' Empty Empty))) (Node 'L' *** Exception: /Documents/foo.hs:(25,1)-(26,57): Non-exhaustive patterns in function changeToP といったエラーを吐きます。 「パターンが徹底されていない」といった意味のエラーのようなんですが、パターンマッチは完璧だと思います。 ていうか、そもそも本のサンプル通りに書いてます。 本ではこれでうまくいくようなんですが自分の環境ではこのざまです。 何がいけないでしょうか。 ちなみにOSはmac os x 10.7.5で、haskell処理系はghc 7.4.2です。 よろしくお願いします。

    • puntero
    • 回答数1