期待一个类型但实际上得到一个 Maybe a0
Expecting a type but actually getting a Maybe a0
我有一个函数使用 Aeson 从文件中的 json 对象获取数据。数据和函数定义如下。
data Data = Data { date :: String
, temperature :: Int
} deriving (Show, Read, Generic)
data Temperatures = Temperatures { temperatures :: [Data]
} deriving (Show, Generic)
mooStuff :: IO Temperatures
mooStuff = decode <$> getFile
where
getFile = B.readFile "Hello.txt"
函数正在使用的文件包含:
Data {date = "2015-02-28T20:16:12+00:00", temperature = 0}
Data {date = "2015-01-01T21:46:55+00:00", temperature = 2}
Data {date = "2015-04-08T21:46:53+00:00", temperature = 3}
Data {date = "2015-04-09T21:46:01+00:00", temperature = 4}
Data {date = "2015-04-10T21:46:40+00:00", temperature = 5}
Data {date = "2015-04-11T21:46:36+00:00", temperature = 6}
Data {date = "2015-04-12T20:36:25+00:00", temperature = 7}
但是我遇到了类型错误:
test.hs:37:13:
Couldn't match type ‘Maybe a0’ with ‘Temperatures’
Expected type: B.ByteString -> Temperatures
Actual type: B.ByteString -> Maybe a0
In the first argument of ‘(<$>)’, namely ‘decode’
In the expression: decode <$> getFile
我已经盯着这个看了好几个小时了,但无济于事。任何关于我哪里出错的想法都将不胜感激!
错误的原因是decode
并不总是成功。它的类型是
decode :: Data a => ByteString -> Maybe a
相应地,
(decode <$>) :: Data a => IO ByteString -> IO (Maybe a)
-- desired type, IO Temperatures, won't unify
类型错误消息为您提供抽象 Maybe a0
作为实际类型,因为它在接近选择合适的点之前检测到 Maybe
和 Temperatures
之间的冲突decode
.
类型的 Data a
实例
您的代码需要考虑文件传送其内容但未成功 decode
到 Temperatures
的可能性。
类似
do mt <- decode <$> getFile
case mt of
Nothing -> -- handle failure here
Just t -> return t
或者如果您对 decode
未能触发 IO
"user error" 感到高兴,只需
do Just t <- decode <$> getFile
return t
无论如何,有一个您的代码没有解决的故障模式,这就是类型错误。
我有一个函数使用 Aeson 从文件中的 json 对象获取数据。数据和函数定义如下。
data Data = Data { date :: String
, temperature :: Int
} deriving (Show, Read, Generic)
data Temperatures = Temperatures { temperatures :: [Data]
} deriving (Show, Generic)
mooStuff :: IO Temperatures
mooStuff = decode <$> getFile
where
getFile = B.readFile "Hello.txt"
函数正在使用的文件包含:
Data {date = "2015-02-28T20:16:12+00:00", temperature = 0}
Data {date = "2015-01-01T21:46:55+00:00", temperature = 2}
Data {date = "2015-04-08T21:46:53+00:00", temperature = 3}
Data {date = "2015-04-09T21:46:01+00:00", temperature = 4}
Data {date = "2015-04-10T21:46:40+00:00", temperature = 5}
Data {date = "2015-04-11T21:46:36+00:00", temperature = 6}
Data {date = "2015-04-12T20:36:25+00:00", temperature = 7}
但是我遇到了类型错误:
test.hs:37:13:
Couldn't match type ‘Maybe a0’ with ‘Temperatures’
Expected type: B.ByteString -> Temperatures
Actual type: B.ByteString -> Maybe a0
In the first argument of ‘(<$>)’, namely ‘decode’
In the expression: decode <$> getFile
我已经盯着这个看了好几个小时了,但无济于事。任何关于我哪里出错的想法都将不胜感激!
错误的原因是decode
并不总是成功。它的类型是
decode :: Data a => ByteString -> Maybe a
相应地,
(decode <$>) :: Data a => IO ByteString -> IO (Maybe a)
-- desired type, IO Temperatures, won't unify
类型错误消息为您提供抽象 Maybe a0
作为实际类型,因为它在接近选择合适的点之前检测到 Maybe
和 Temperatures
之间的冲突decode
.
Data a
实例
您的代码需要考虑文件传送其内容但未成功 decode
到 Temperatures
的可能性。
类似
do mt <- decode <$> getFile
case mt of
Nothing -> -- handle failure here
Just t -> return t
或者如果您对 decode
未能触发 IO
"user error" 感到高兴,只需
do Just t <- decode <$> getFile
return t
无论如何,有一个您的代码没有解决的故障模式,这就是类型错误。