从 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
我正在尝试从 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