私は宿題に取り組んでいて、何かに行き詰まっています。
> 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 }
問題を理解するのに多くの時間を費やしましたが、見つけることができませんでした。助けていただければ幸いです。