相关疑难解决方法(0)

如何从一元行动中提取价值

是否有带签名的内置功能:: (Monad m) => m a -> a

Hoogle告诉我们没有这样的功能.

你能解释一下原因吗?

monads haskell comonad

39
推荐指数
6
解决办法
1万
查看次数

Haskell函数类型:IO String-> String

我在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的某些地方,但我找不到解决问题的方法.

io monads haskell readfile

35
推荐指数
4
解决办法
3万
查看次数

Haskell真的是纯粹的(任何处理系统外输入和输出的语言)?

在功能编程方面触及Monads之后,该功能是否实际上使语言变得纯粹,或者它是否只是另一个"从监狱免费卡中获取"来推理现实世界中的计算机系统,在黑板数学之外?

编辑:

这不是有人在这篇文章中所说过的火焰诱饵,而是一个真正的问题,我希望有人可以用枪击我说,证明,这是纯粹的.

此外,我正在研究关于其他不那么纯粹的功能语言和一些使用良好设计和比较纯度的OO语言的问题.到目前为止,在我非常有限的FP世界中,我仍然没有理解Monads的纯度,你会很高兴地知道我喜欢不变性的想法,这在纯度赌注中更为重要.

monads haskell functional-programming referential-transparency

35
推荐指数
3
解决办法
4337
查看次数

Haskell中的I/O是否具有功能性?

刚刚开始看看Haskell(我之前的FP体验是在Scheme中),我遇到了这段代码:

do { putStrLn "ABCDE" ; putStrLn "12345" }
Run Code Online (Sandbox Code Playgroud)

对我来说,这是程序式编程,如果有的话 - 特别是因为副作用的连续性.

有人请说明这段代码在任何方面都是"功能性的"吗?

io haskell functional-programming

15
推荐指数
3
解决办法
1088
查看次数

在IO中提取Maybe值

鉴于以下内容:

> (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?

io monads haskell maybe

15
推荐指数
3
解决办法
2607
查看次数

如何在Haskell中从monad中取出一个值?

有没有办法从单子中取出"东西"?

我正在开发一款游戏,现在我正在尝试了解数据库.我发现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搜索了一下,但我一无所获.

monads haskell

12
推荐指数
1
解决办法
3241
查看次数

哈斯克尔:陷入IO monad

我试图使用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)

io haskell

7
推荐指数
2
解决办法
854
查看次数

从IO a写一个函数 - > a?

使用函数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)

如果这是不可能的.为什么我不能这样做?

haskell

2
推荐指数
1
解决办法
232
查看次数

为什么monad不能被分解?

我不明白为什么我不能分解(让我们说IO)monad.喜欢IO a -> a

我的问题使用happstack和想要得到的时候起源Text的出ServerPart (Maybe Text)这是由返回(optional $ lookText "domain").然后我记得读到IOmonad无法逃脱.

我已经读过unsafePerformIO它以及它为什么不好的原因,但这些原因似乎都没有回答我的问题.

io monads haskell happstack

1
推荐指数
2
解决办法
378
查看次数

如何在Haskell中正确处理IO返回值

嗨,我有一个非常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所以我必须isCorrectdo块内调用吗?有另一种方式来解析IO StringString

在第一种情况下,我感觉失去了函数式编程的所有好处,因为我最终会在do块中编写我的整个代码以便访问 …

io haskell functional-programming

1
推荐指数
1
解决办法
108
查看次数

Haskell如何存储返回值并将其与正则表达式匹配?

这行代码应返回一个字符串,但它返回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)

haskell

-1
推荐指数
1
解决办法
82
查看次数