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 回答