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

Get specific EXIF tag from HsExif.parseFileExif

我正在尝试从 HsExif 获取特定标签(例如 dateTimeDigitized)。 Documentation says I can do it using 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

如何解决这个问题?

错误很简单:

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 编辑的 return 值 不是 您可以调用 lookup 的列表。这是一个 Either String (...Map ExifTag ExifValue)。 另请注意,文档并未说明您可以在 parseFileExif 的 return 值上使用 lookup。只有你可以通过某种方式使用 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 return 是 Maybe a。所以你可能想使用 Data.Maybe:

中的 fromMaybe 函数
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