【发布时间】:2014-03-16 09:41:34
【问题描述】:
还有一个愚蠢的问题 =) 我有一个带有 Handle 字段的自定义数据类型:
import System.IO
data CustomType = CustomType {
file::Handle
}
如何设置file 字段?我正在尝试使用这个明显的代码:
let someFile = openFile fileName AppendMode
let object = CustomType {
file=someFile
}
但是openFile 有一个类型openFile :: FilePath -> IOMode -> IO Handle,所以我遇到了错误
Couldn't match expected type `Handle' with actual type `IO Handle'
那么我怎样才能在这个字段中存储Handle 对象呢?
UPD
我也在尝试这个
data CustomType = CustomType {
file::IO Handle
}
但是当我使用 hPutStrLn 函数时,这会导致错误
let object = CustomType {
file=someFile
}
hPutStrLn (file object)
错误信息是:
Couldn't match expected type `Handle' with actual type `IO Handle'
In the return type of a call of `file'
In the first argument of `TO.hPutStrLn', namely `(file object)'
In a stmt of a 'do' block:
TO.hPutStrLn (file object) text
【问题讨论】:
-
在
file记录中使用IO Handle类型怎么样? -
没关系,但是我不知道如何使用
hPutStrLn(我正在尝试hPutStrLn (file object),其中对象是CustomType) -
您必须使用
IO monad:file object >>= \h -> hputStrLn h "someline"。那对你有用吗?我可以在下面给出更长的解释作为答案。 -
@DannyNavarro 抱歉回复太晚了。是的,它对我有用。但是更正确的选择是什么——存储
IO Handle或Handle记录?另外,我想,我必须了解更多关于IOmonad - 但我很高兴看到你用更长的解释来回答 =) -
在你的类型中使用
IO Handle会是一个快速而肮脏的解决方案,但一般来说,在Haskell 中,最好使IO代码尽可能的精简。这样你就可以利用 Haskell 的纯粹性。所以在你的类型中只使用Handle,如下面的答案所示,我认为它更好。