2

私は宿題に取り組んでいて、何かに行き詰まっています。

> data Channel a = Chan { cap   :: Int 
>                       , queue :: [a]  }

> data FiniteChan a = IORef (Channel a)

> newFiniteChan :: Int -> IO (FiniteChan a)
> newFiniteChan capacity = do x <- newIORef (Chan {cap = capacity, queue = []})
>                             return x

基本的にはChannel a、newFiniteChan が呼び出されたときの参照を作成し、その参照を意味したいFiniteChan a(newFiniteChan の署名を変更することはできません)。これをコンパイルすると、次のエラーが発生します。

final.lhs:235:38:
    Couldn't match expected type `FiniteChan a'
                with actual type `IORef (Channel a0)'
    In the first argument of `return', namely `x'
    In a stmt of a 'do' block: return x
    In the expression:
      do { x <- newIORef (Chan {cap = capacity, queue = []});
           return x }

問題を理解するのに多くの時間を費やしましたが、見つけることができませんでした。助けていただければ幸いです。

4

1 に答える 1

1

コンストラクターをFiniteChanデータ型に追加するか、それをエイリアス命令に変換する必要があります。これにより、次のようにコンパイルされます。

import Data.IORef

data Channel a = Chan { cap   :: Int
                      , queue :: [a]  }

data FiniteChan a = FiniteChan (IORef (Channel a))

newFiniteChan :: Int -> IO (FiniteChan a)
newFiniteChan capacity = do
        x <- newIORef (Chan {cap = capacity, queue = []})
        return $ FiniteChan  x
于 2013-03-16T11:30:34.393 に答える