gpt4 book ai didi

Haskell ReplicateM IO

转载 作者:行者123 更新时间:2023-12-02 10:15:22 26 4
gpt4 key购买 nike

我正在尝试创建一个允许用户输入字符串列表的函数。该函数获取长度并允许用户再输入 length-1 行。然后检查每条线以确保其与原始线的长度相同。但是,我遇到了一些问题,并且找不到解决方案。

问题是我可以输入超过 count-1 行,并且长度没有按照我的预期计算。例如,如果我输入 ["12","13"] 然后输入 ["121", "13"] 给出了错误,尽管它们的长度相同!

read :: IO [Line]
read = do
line <- getLine
let count = length line
lines <- replicateM (count-1) $ do
line <- getLine
if length line /= count
then fail "too long or too short"
else return line
return $ line : lines

行的类型为字符串。

readLn 给出解析错误。

最佳答案

在我看来,您对将一行作为 String 获取与将一行输入读取/解析为自定义类型之间的区别感到困惑。您正在使用getLine,它始终返回用户键入的String。比较:

Prelude> fmap length getLine
["12","13"]
11
Prelude> length "[\"12\",\"13\"]" -- explanation of the 11
11
Prelude> fmap length (readLn :: IO [String])
["12","13"]
2
Prelude> length ["12", "13"] -- explanation of the 2
2

如此处所示,您可能想要使用 readLn,它首先获取一行输入,然后使用 read 解析它。

-- defined in the Prelude
readLn = do
s <- getLine
return (read s)

如果我修改您的代码以包含以下导入和定义:

import Control.Monad
type Line = [String]

...并调用 readLn 而不是 getLine,然后我可以输入文字行 ["12","13"]["121","13"] 没有错误。

关于Haskell ReplicateM IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9666034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com