是否有带签名的内置功能:: (Monad m) => m a -> a?
Hoogle告诉我们没有这样的功能.
你能解释一下原因吗?
鉴于以下计划,我遇到了与monad打交道的问题.
module Main
where
import System.Environment
import System.Directory
import System.IO
import Text.CSV
--------------------------------------------------
exister :: String -> IO Bool
exister path = do
fileexist <- doesFileExist path
direxist <- doesDirectoryExist path
return (fileexist || direxist )
--------------------------------------------------
slurp :: String -> IO String
slurp path = do
withFile path ReadMode (\handle -> do
contents <- hGetContents handle
last contents `seq` return contents )
--------------------------------------------------
main :: IO ()
main = do
[csv_filename] <- getArgs
putStrLn (show csv_filename)
csv_raw <- slurp …Run Code Online (Sandbox Code Playgroud) 老实说,我觉得这必须有一个傻瓜的地方,但我找不到它 甚至 后 搜索 。
假设我有以下代码来简单地从用户那里读取一个 double 并将其回显:
import qualified Control.Monad.Except as E
import Text.Read(readMaybe)
data Error = ParseError String
| Default String deriving (Show)
type ThrowsError = Either Error
main = do
putStrLn "Enter your number: "
val <- getDouble
print val
parseString :: String -> ThrowsError Double
parseString val = maybe (E.throwError $ ParseError val) return
(readMaybe val :: Maybe Double)
getDouble :: ThrowsError Double
getDouble = getLine >>= parseString
Run Code Online (Sandbox Code Playgroud)
这在两个地方中断:
在main,putStrLn是类型IO …
我想将monadic值转换为另一个Monad类的monadic值.
让我们说我有一个实例声明:
instance ClassM TypeT where
funcX = abc >>= \x -> return (x)
Run Code Online (Sandbox Code Playgroud)
ClassM:是一个自己的monad定义类
TypeT:是一个自己定义的类型/数据,带有monad实现实现
abc:类型为IO a
我如何将abc :: IO a
的monadic值转换为classM的monadic值m => ma
又名m1 a - > m2 a(其中m1不是m2)(例如:IO 5 - >只是5)
我对funcX的实现显然不正确.如果有可能,那么正确的实施应该是什么?
感谢您的时间和帮助.
我完成了页面卷曲的内容.找到正确的数据并在其基础上形成以下查询.但数据属于类型IO [String].要求简单String.如何转换IO [String]为String?