Haskell 如何塞住这种类型的孔2

Haskell 如何塞住这种类型的孔2,haskell,Haskell,接下来(我将代码从main重构为自己的函数),我尝试编译以下代码: import qualified Data.Text as T import Text.PDF.Info title :: FilePath -> String title path = do result <- pdfInfo path case result of Left someError -> do return "no title" Right info -&g

接下来(我将代码从main重构为自己的函数),我尝试编译以下代码:

import qualified Data.Text as T
import Text.PDF.Info

title :: FilePath -> String
title path = do
  result <- pdfInfo path
  case result of
    Left someError -> do
      return "no title"
    Right info -> do
      case (pdfInfoTitle info) of
        Nothing -> return "no title"
        Just title -> return (T.unpack title)
对我来说,它看起来像是返回一个字符串([Char])类型,但我想不是。请指导,提前谢谢

这是在我希望实现的更大背景下:

module Main where

import Control.Monad (liftM)
import Data.List (isSubsequenceOf, isSuffixOf)
import System.Directory (listDirectory)
import qualified Data.Text as T
import Text.PDF.Info

title :: FilePath -> String
title path = do
  result <- pdfInfo path
  case result of
    Left someError -> do
      return "no title"
    Right info -> do
      case (pdfInfoTitle info) of
        Nothing -> return "no title"
        Just title -> return (T.unpack title)

main :: IO ()
main = do
  print =<<
    liftM
      (filter
         (\path ->
            ((isSubsequenceOf "annotated" path) ||
             (isSubsequenceOf "annotated" (title path))) &&
            (isSuffixOf "pdf" path)))
      (listDirectory "/home/foo")
modulemain其中
进口管制.Monad(liftM)
导入数据列表(isSubsequenceOf、isSuffixOf)
导入系统目录(listDirectory)
导入符合条件的数据。文本为T
导入Text.PDF.Info
标题::文件路径->字符串
标题路径=do
结果如何
返回“无标题”
右信息->做
案例(pdfInfoTitle信息)
无->返回“无标题”
仅标题->返回(T.解包标题)
main::IO()
main=do
印刷品=
((isSubsequenceOf“annotated”路径)||
(IsubSequenceof“annotated”(标题路径)))&&
(isSuffixOf“pdf”路径)))
(列表目录“/home/foo”)
对我来说,它看起来像是在返回一个
字符串
[Char]
)类型

<代码>返回不像大多数命令式语言那样是返回内容的关键字。这是一个函数。实际上,它是一个“以一元类型注入值”的函数

pdfInfo
函数具有as类型。因此,我们需要使用
MonadIO
类型:

title :: MonadIO m => FilePath -> m String
title path = do
    result <- pdfInfoTitle info
    case pdfInfo path of
        Left someError -> return "no title"
        Right info -> case (pdfInfoTitle info) of
            Nothing -> return "no title"
            Just title -> return (T.unpack title)
title::MonadIO m=>FilePath->m String
标题路径=do
结果返回“无标题”
右侧信息->案例(pdfInfoTitle信息)
无->返回“无标题”
只需标题->返回(T.解包标题)

因此,我们在这里返回一个
m字符串
。您可以将
MonadIO
视为构造值的“配方”(这里是
String
)。不是
字符串本身。

return
与许多命令式语言中的关键字不同<代码>返回::Monad m=>a->ma
是一个函数。因此,在这里它使函数成为一个
Monad m=>m字符串
。这种情况已经发生了,因为您使用了
do
。除了@WillemVanOnsem之外,
pdfInfo
函数还执行IO,因此从该函数返回到纯代码是“不可能的”。因此,没有一个函数像您的函数那样使用它,可以返回一个“普通的”
字符串
,或者任何其他不涉及
IO
@RobinZigmond的类型,啊,这真的很有帮助。不知道如何挽救我所拥有的…@Joe只是让你的函数返回一个
IO字符串
,而不是
字符串
。我相信在这种情况下,你可以简单地离开函数体,但我没有详细检查。然后在
main
中,您可以通过执行类似
x的操作“分配”到
title
的结果。此操作的可能副本很有用,谢谢。现在,我想为
x@Joe获得正确的do语法,但您不能使用
x下一个问题:
title :: MonadIO m => FilePath -> m String
title path = do
    result <- pdfInfoTitle info
    case pdfInfo path of
        Left someError -> return "no title"
        Right info -> case (pdfInfoTitle info) of
            Nothing -> return "no title"
            Just title -> return (T.unpack title)