是否有带签名的内置功能:: (Monad m) => m a -> a
?
Hoogle告诉我们没有这样的功能.
你能解释一下原因吗?
我在Haskell中编写了一堆代码来创建文本索引.top函数如下所示:
index :: String -> [(String, [Integer])]
index a = [...]
Run Code Online (Sandbox Code Playgroud)
现在我想给这个函数一个从文件读取的字符串:
index readFile "input.txt"
Run Code Online (Sandbox Code Playgroud)
哪个不起作用,因为readFile的类型为FilePath - > IO String.
无法将预期类型'String'与推断类型'IO String'匹配
我看到错误,但我找不到任何类型的函数:
IO String -> String
Run Code Online (Sandbox Code Playgroud)
我想成功的关键在于Monads的某些地方,但我找不到解决问题的方法.
在功能编程方面触及Monads之后,该功能是否实际上使语言变得纯粹,或者它是否只是另一个"从监狱免费卡中获取"来推理现实世界中的计算机系统,在黑板数学之外?
编辑:
这不是有人在这篇文章中所说过的火焰诱饵,而是一个真正的问题,我希望有人可以用枪击我说,证明,这是纯粹的.
此外,我正在研究关于其他不那么纯粹的功能语言和一些使用良好设计和比较纯度的OO语言的问题.到目前为止,在我非常有限的FP世界中,我仍然没有理解Monads的纯度,你会很高兴地知道我喜欢不变性的想法,这在纯度赌注中更为重要.
monads haskell functional-programming referential-transparency
我刚刚开始看看Haskell(我之前的FP体验是在Scheme中),我遇到了这段代码:
do { putStrLn "ABCDE" ; putStrLn "12345" }
Run Code Online (Sandbox Code Playgroud)
对我来说,这是程序式编程,如果有的话 - 特别是因为副作用的连续性.
有人请说明这段代码在任何方面都是"功能性的"吗?
鉴于以下内容:
> (liftM2 fromMaybe) (ioError $ userError "OOPS") (return $ Just "ok")
Run Code Online (Sandbox Code Playgroud)
ghci给了我
*** Exception: user error (OOPS)
Run Code Online (Sandbox Code Playgroud)
当然,来自Maybe的工作正常:
> (liftM2 fromMaybe) (return $ "not me") (return $ Just "ok")
"ok"
Run Code Online (Sandbox Code Playgroud)
但似乎IO操作正在执行然后被丢弃:
> (liftM2 fromMaybe) (putStrLn "computing.." >> "discarded") (return $ Just "ok")
computing..
"ok"
Run Code Online (Sandbox Code Playgroud)
为什么会这样?有没有什么方法可以让IO Monad更加懒散?
具体来说,考虑value :: IO (Maybe a)
到(简洁,简洁)的说法
result <- (liftM2 fromMaybe) err value
Run Code Online (Sandbox Code Playgroud)
并解压缩结果或相应地抛出IOError?
有没有办法从单子中取出"东西"?
我正在开发一款游戏,现在我正在尝试了解数据库.我发现happstack
非常好,但我无法得到这个东西.
例如,我有这个功能(希望你熟悉happstack
)
getAllThings :: MonadIO m => m [Thing]
getAllThings = do
elems <- query GetThings
return elems
Run Code Online (Sandbox Code Playgroud)
所以我明白了m [Things]
,但我不能在我的模型中使用它!例如
doSomeThingWithThings :: [Thing] -> Something
Run Code Online (Sandbox Code Playgroud)
我用Google搜索了一下,但我一无所获.
我试图使用haskell-src-exts包中的parseFile函数解析文件.我正在尝试使用parseFile的输出,这当然是IO,但我无法弄清楚如何绕过IO.我找到了一个函数liftIO,但我不确定这是否是这种情况下的解决方案.这是下面的代码.
import Language.Haskell.Exts.Syntax
import Language.Haskell.Exts
import Data.Map hiding (foldr, map)
import Control.Monad.Trans
increment :: Ord a => a -> Map a Int -> Map a Int
increment a = insertWith (+) a 1
fromName :: Name -> String
fromName (Ident s) = s
fromName (Symbol st) = st
fromQName :: QName -> String
fromQName (Qual _ fn) = fromName fn
fromQName (UnQual n) = fromName n
fromLiteral :: Literal -> String
fromLiteral (Int int) = show int
fromQOp :: QOp …
Run Code Online (Sandbox Code Playgroud) 使用函数getLine.
它有一种类型
getLine :: IO String
Run Code Online (Sandbox Code Playgroud)
如何从此IO值中提取String.更一般地说,我该如何转换它.
IO a
Run Code Online (Sandbox Code Playgroud)
对此:
a
Run Code Online (Sandbox Code Playgroud)
如果这是不可能的.为什么我不能这样做?
我不明白为什么我不能分解(让我们说IO)monad.喜欢IO a -> a
?
我的问题使用happstack和想要得到的时候起源Text
的出ServerPart (Maybe Text)
这是由返回(optional $ lookText "domain")
.然后我记得读到IO
monad无法逃脱.
我已经读过unsafePerformIO
它以及它为什么不好的原因,但这些原因似乎都没有回答我的问题.
嗨,我有一个非常noob的问题,让我说我想创建一个游戏,当你必须回答问题时,我写了这个
data Question = Question { answer::String, text::String }
data Player = Player { name::String, points::String }
answerQuestion :: Question -> Player -> Player
answerQuestion question player
| isCorrect question playerAnswer = Player (name player) (points player + 1)
| otherwise = player
where
playerAnswer = do
putStrLn text(question)
getLine
isCorrect :: Question -> String -> Bool
isCorrect question try = try == answer(question)
Run Code Online (Sandbox Code Playgroud)
现在playerAnswer有类型IO String
所以我必须isCorrect
在do
块内调用吗?有另一种方式来解析IO String
成String
?
在第一种情况下,我感觉失去了函数式编程的所有好处,因为我最终会在do
块中编写我的整个代码以便访问 …
这行代码应返回一个字符串,但它返回IO(String).
simpleHTTP(getRequest" http://www.haskell.org/ ")>> = fmap(取100).getResponseBody
如何将上面一行的返回值传递给getAllTextMatches?
import Network.HTTP
import Text.Regex.Posix
search :: String -> IO(String)
search url = do
let link = (simpleHTTP (getRequest url) >>= fmap (take 50000). getResponseBody)
getAllTextMatches (link =~ "(<[a-zA-Z]+>)|(<[a-zA-Z][a-zA-Z]*\s)" :: AllTextMatches [] String)
Run Code Online (Sandbox Code Playgroud)