Haskell 如何塞住这个类型的孔?

Haskell 如何塞住这个类型的孔?,haskell,Haskell,如果我有表达式/值的返回类型: :: Control.Monad.IO.Class.MonadIO m => m (Either PDFInfoError PDFInfo) 我如何从中获取PDFInfo?也许更重要的是,一个人用什么过程来解决这些问题。我希望利用类型化的漏洞或其他一些过程,能够自己通过这些类型的问题(不是双关语)进行推理。仍在阅读我的第一本Haskell书,但想了解一个更有经验的Haskell如何使用工具解决这个问题 也许这将有助于了解问题的更大背景(尝试使用键

如果我有表达式/值的返回类型:

:: Control.Monad.IO.Class.MonadIO m =>
     m (Either PDFInfoError PDFInfo)
我如何从中获取PDFInfo?也许更重要的是,一个人用什么过程来解决这些问题。我希望利用类型化的漏洞或其他一些过程,能够自己通过这些类型的问题(不是双关语)进行推理。仍在阅读我的第一本Haskell书,但想了解一个更有经验的Haskell如何使用工具解决这个问题

也许这将有助于了解问题的更大背景(尝试使用键入的孔,让ghc帮助我找到我缺少的内容,以获得PDFInfo结果,以便我可以调用PDFINFOTILE):


下面是一个编译示例:

module Main where

import Text.PDF.Info

main :: IO ()
main = do
  result <- pdfInfo "foo.pdf"
  case result of
    Left someError -> do
       putStrLn "Oh, no!"
       print someError
    Right info -> do
       putStrLn "OK! Got info!"
       print (pdfInfoTitle info)
modulemain其中
导入Text.PDF.Info
main::IO()
main=do
结果如何
putStrLn“哦,不
打印错误
右信息->做
putStrLn“好的!有消息了!”
打印(pdfInfoTitle信息)
想法是:在您的类型中,monad
m
可以根据我们的意愿选择,只要
m
属于类
MonadIO
m=IO
满足了这一点,因此我们可以在
main
内部“运行”
pdfinfoo“foo.pdf”
,就像
putStrLn“hello”
l…
,您可以一直假装
m=IO
。它们的类型略比这更一般,但保持简单有助于直觉。)


因此,我们可以使用
result下面是一个编译示例:

module Main where

import Text.PDF.Info

main :: IO ()
main = do
  result <- pdfInfo "foo.pdf"
  case result of
    Left someError -> do
       putStrLn "Oh, no!"
       print someError
    Right info -> do
       putStrLn "OK! Got info!"
       print (pdfInfoTitle info)
modulemain其中
导入Text.PDF.Info
main::IO()
main=do
结果如何
putStrLn“哦,不
打印错误
右信息->做
putStrLn“好的!有消息了!”
打印(pdfInfoTitle信息)
想法是:在您的类型中,monad
m
可以根据我们的意愿选择,只要
m
属于类
MonadIO
m=IO
满足了这一点,因此我们可以在
main
内部“运行”
pdfinfoo“foo.pdf”
,就像
putStrLn“hello”
l…
,您可以一直假装
m=IO
。它们的类型略比这更一般,但保持简单有助于直觉。)


因此,我们可以使用
result,您需要生成该类型的值还是使用该类型的值?我问这个问题是因为,对我来说,“type hole”表示生产,而“out it”表示消费。我需要从表达式中返回该类型的值,这样我就可以调用pdfInfoTitle并将该值返回main您所说的“从表达式中返回值”是什么意思?再说一遍,生产还是消费?“return a value”正在生成,“from a expression”正在消耗,因此仍然不清楚:-/我想在得到pdfInfoTitle的结果后对其采取进一步的操作,直到得到PDFInfo值为止。我希望这会有所帮助。您需要生成该类型的值,还是使用该类型的值?我问这个问题是因为,对我来说,“type hole”表示生产,而“out it”表示消费。我需要从表达式中返回该类型的值,这样我就可以调用pdfInfoTitle并将该值返回main您所说的“从表达式中返回值”是什么意思?再说一遍,生产还是消费?“return a value”正在生成,“from a expression”正在消耗,因此仍然不清楚:-/我想在得到pdfInfoTitle的结果后对其采取进一步的操作,直到得到PDFInfo值为止。我希望这会有帮助。谢谢!如果我只想得到标题,而不是:仅仅是“标题”,作为逻辑正确分支的结果,我该怎么办?我现在想对实际的标题字符串执行操作。@Joe该标题有一个
可能是Text
类型,因为它可能在pdf文件中丢失。您可以通过提供默认标题将其转换为
文本,例如
导入数据后的
打印(从可能的“无标题”(pdfInfoTitle info))
。这里,
case-pdfInfoTitle-info-of-Nothing->;作为一个基本的替代方案,只需标题->..
也可以。@Joe做同样的事情,这个答案对
或者
:模式匹配<代码>案例pdfInfoTitle信息无->{-…-};只需标题->{-…-}
下一个问题:谢谢!如果我只想得到标题,而不是:仅仅是“标题”,作为逻辑正确分支的结果,我该怎么办?我现在想对实际的标题字符串执行操作。@Joe该标题有一个
可能是Text
类型,因为它可能在pdf文件中丢失。您可以通过提供默认标题将其转换为
文本,例如
导入数据后的
打印(从可能的“无标题”(pdfInfoTitle info))
。这里,
case-pdfInfoTitle-info-of-Nothing->;作为一个基本的替代方案,只需标题->..
也可以。@Joe做同样的事情,这个答案对
或者
:模式匹配<代码>案例pdfInfoTitle信息无->{-…-};只需标题->{-…-}
下一个问题: