我在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 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吗?
有人可以帮我吗?
我有一个游戏,用户与计算机,我想随机选择谁开始游戏.我有
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 Int与IO 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
我正在尝试编写一个函数,该函数对每行提供的整数求和,并在输入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匹配
我有问题将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字符串转换为字符串?
我是 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。
问题: …