我试图从dateTimeDigitized
获取特定代码(例如HsExif
)。
Documentation说我可以使用lookup
函数来执行此操作
试试这个:
img <- parseFileExif image
let time = lookup dateTimeDigitized img
导致此错误:
Couldn't match expected type `[(ExifTag, b0)]'
with actual type `Either
String (containers-0.5.0.0:Data.Map.Base.Map ExifTag ExifValue)'
In the second argument of `lookup', namely `img'
In the expression: lookup dateTimeDigitized img
In an equation for `time': time = lookup dateTimeDigitized img
如何解决这个问题?
答案 0 :(得分:1)
错误非常简单:
Couldn't match expected type `[(ExifTag, b0)]'
with actual type `Either
String (containers-0.5.0.0:Data.Map.Base.Map ExifTag ExifValue)'
In the second argument of `lookup', namely `img'
这告诉你:lookup
函数想要一个类型为[(ExifTag, b0)]
的值作为第二个参数,但你给了Either String (...Map ExifTag ExifValue)
。
事实上,parseFileExif
返回的值不您可以调用lookup
的列表。它是Either String (...Map ExifTag ExifValue)
。
另请注意,文档并未说明您可以在lookup
的返回值上使用parseFileExif
。只有你可以以某种方式使用lookup
(如果你知道Either
是什么就很明显)来获得你想要的字段。
您必须使用case
来增加Right
值。例如:
img <- parseFileExif image
let time = case img of
Left errorMessage -> ... handle error
Right value -> lookup dateTimeDigitized value
请注意,虽然该软件包的文档链接到Data.List.lookup
,但它们可能意味着Data.Map.lookup
,因为该值为Map
。
另请注意,lookup
会返回Maybe a
。因此,您可能希望使用fromMaybe
中的Data.Maybe
函数:
img <- parseFileExif image
let time = fromMaybe 0 $ case img of
Left errorMessage -> ... handle error
Right value -> lookup dateTimeDigitized value
或不安全 fromJust
功能:
img <- parseFileExif image
let time = case img of
Left errorMessage -> ... handle error
Right value -> fromJust $ lookup dateTimeDigitized value
(再次来自Data.Maybe
模块)。
所以整个程序看起来像
import Data.Maybe(fromJust)
import qualified Data.Map as Map
main = do
img <- parseFileExif image
let time = case img of
Left _ -> error "unable to parse data"
Right val -> fromJust $ Map.lookup dateTimeDigitized val