相关疑难解决方法(0)

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中连接String和IO Integer

我编写了一个函数,将当前屏幕宽度作为IO Integer返回(到目前为止工作).

getScreenWidth:: IO Integer
getScreenWidth = do
                    (sx, sy, w, h) <- getScreenDim 0
                    return $ sx
Run Code Online (Sandbox Code Playgroud)

现在我想将屏幕宽度添加到字符串:

> magic_function :: IO Integer -> String -> ... magic output type
> magic_function = ... ? this is where i am stack at ? ...
Run Code Online (Sandbox Code Playgroud)

我想魔术函数传递一个字符串,像"屏幕宽度:"我希望它添加当前屏幕的宽度,使我得到"屏幕宽度:1680".如何连接IO Integer和常用String?它有用show吗?

有人可以帮我吗?

string io haskell integer concatenation

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

如果语句使用IO Int haskell

我有一个游戏,用户与计算机,我想随机选择谁开始游戏.我有

a = getStdRandom $ randomR (0, 1)
Run Code Online (Sandbox Code Playgroud)

这得到一个随机数0或1.但它是一个IO Int,所以我不能有一个if语句将它与一个数字相比较

if a == 0 then userStarts else computerStarts 
Run Code Online (Sandbox Code Playgroud)

我试图比较IO IntIO Int和它不工作了,我也试着

将IO Int转换为Int

我对Haskell很新,不知道如何处理这个问题.要求的代码详情:

randomNumber =  getStdRandom $ randomR (0, length symbols - 5) --  this will be 0 or 1
randomNumber2 =  getStdRandom $ randomR (0, length symbols - 5) -- according to 
                     -- the solution I need another function returning IO int.

a = do
   x <- randomNumber
   randomNumber2 $ pureFunction x …
Run Code Online (Sandbox Code Playgroud)

random haskell functional-programming io-monad haskell-stack

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

Haskell - 从键盘读取的整数之和

我正在尝试编写一个函数,该函数对每行提供的整数求和,并在输入0时停止.到目前为止我有这个:

getInt :: IO Int          
getInt = do  
  s <- getLine
  return (read s)

sumInts :: IO Int
sumInts = do
  x<-getInt
  if x==0 then return 0 else return (x+sumInts)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试运行它时出现错误:

无法将预期类型Int与实际类型IO Int匹配

haskell

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

将IO String转换为String

我有问题将IO String()转换为String()下面是评估表达式的函数.

foobar :: String -> IO String

eval :: String -> Sh () ()
eval x =  do
 s <- foobar x
 shellPutStrLn $ s
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为eval返回IO String而不是Sh.一些IO在一个函数内完成的那一刻它将它转换/篡改成IO String.如何防止转换或将IO字符串转换为字符串?

io monads haskell types

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

TVar 构造函数?我找不到 TVar

我是 Haskell 和 stm 的新手,我想制作一个简单的 rwlock。首先,我创建了 4 个主要函数(wlock、wunlock、rlock、runlock),需要 2 个 TVar 整数:读取线程和写入线程的数量。

此时我无法按预期使用它。我尝试这样编译

v1 <- atomically(newTVar 0);
v2 <- atomically(newTVar 0);
wlock v1 v2 -- wlock :: TVar Integer -> TVar Integer -> IO ()
Run Code Online (Sandbox Code Playgroud)

这当然很丑陋,但它有效(不知道为什么,因为原子地返回IO (TVar a)而不是TVar a

我想要的是:

我试图通过隐藏价值观来让它变得更好。我在某处读到单子可能是可行的方法,但我还没有研究它们。相反,我尝试创建一个新类型的 Rwlock 作为

data Rwlock = Rwlock {  readCant :: TVar Integer 
    ,writeCant :: TVar Integer
}
Run Code Online (Sandbox Code Playgroud)

和一个构造函数,所以我可以做这样的事情:

import Rwlock

do{
    a = rwconst;
    forkIO(reader a);
    forkIO(writer a);
}
Run Code Online (Sandbox Code Playgroud)

rlock a读者和作者都会打电话的地方wlock a

问题: …

haskell stm tvar

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