Haskell 如何塞住这种类型的孔2
接下来(我将代码从main重构为自己的函数),我尝试编译以下代码: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
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)