5

次のコードを書きました。Readerそれは機能し、モナドを使用しています。

Haskell のコード スタイルに関するヒントを教えてください。主に、私はモナドを意味します - 私は初心者です。

import Control.Monad.Reader

data Tree a = Node a (Tree a) (Tree a)
            | Empty

renumberM :: Tree a -> Reader Int (Tree Int)
renumberM (Node _ l r) = ask >>= (\x -> 
                         return (Node x (runReader (local (+1) (renumberM l)) x) 
                                        (runReader (local (+1) (renumberM r)) x)))
renumberM Empty = return Empty

renumber'' :: Tree a -> Tree Int
renumber'' t = runReader (renumberM t) 0
4

2 に答える 2

2

;Readerを使用して、ここで行う方法に出入りする必要はありません。runReader代わりに、次のように書き換えることができます

renumberR :: Tree a -> Reader Int (Tree Int)
renumberR (Node _ l r) = do
    x <- ask
    l' <- local (+1) (renumberR l)
    r' <- local (+1) (renumberR r)
    return (Node x l' r')
renumberR Empty = return Empty

ただし、 の適用可能なインターフェイスを使用するだけで、さらに適切に記述できますReader

renumberR (Node _ l r) =
    Node <$> ask <*> local (+1) (renumberR l) <*> local (+1) (renumberR r)
renumberR Empty = pure Empty

renumberRで実行されるという事実を強調するために、関数の名前を に変更しましReaderたが、必ずしもモナド インターフェイスを使用しているとは限らないことに注意してください。

于 2016-04-07T12:34:57.460 に答える