从HsExif.parseFileExif获取特定的EXIF标记

时间:2015-09-20 10:43:30

标签: haskell jpeg exif

我试图从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

如何解决这个问题?

1 个答案:

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