2

我完全是 Haskell 的菜鸟,我根本无法让我的代码正常工作,而且我不知道如何修复它!我需要帮助 :) 如果有人知道我需要在哪里寻找以解决我的问题,我会非常感谢想法并朝着正确的方向轻推。

我正在尝试创建一种 C# string.Format 类型,它会重复直到列表完成。该列表由用户输入创建,然后我只想重复一个字符串,直到列表完成。

    test :: Integer -> String
    let list_n [0..k]
    test k = putStrLn (r * r) | r <- list_n   --My idea here is that i am forcing 
    --the entire list onto r and making it repeated as long as there is more in the
    --list, But im not even sure that is possible :(

有人对如何做到这一点有更好的想法吗?我想要一行而不是一行的所有结果,因此我试图创建迭代,但在 HaskeLL 中,说起来容易做起来难:/

4

3 回答 3

5

这里有两个建议;一个尝试匹配您发布的代码,另一个尝试匹配您发布的英语。这似乎主要是关于语法的问题,所以我不确定除了“阅读教程”之外还有很多有意义的解释。

-- match the code
test :: Int -> String
test k = concat [show (r * r) | r <- [0..k]]

-- match the English
test :: Int -> String -> String
test k s = concat [s | r <- [0..k]]
于 2012-09-06T18:00:40.683 回答
3

这是更接近命令式风格的东西:

import Control.Monad (forM_)

test :: Int -> IO ()
test n = forM_ [0..n] (\i -> putStrLn $ show $ i*i)

这大致翻译为:“对于 [0..n] 中的每个 i,做 ...”

于 2012-09-06T21:27:07.137 回答
3

也许您的意思是打印给定的字符串n时间,并且您似乎想用每个字符串开始一个换行符,并且您似乎想使用列表理解,这将是

test :: Integer -> String -> IO ()
test n xs = sequence_ [putStrLn xs| i<- [1..n]]

但你会扔掉i你计算的整数。你最好这样做

test n xs = replicateM_ n (putStrLn xs)

这使

Main> test 3 "Hello"
Hello
Hello
Hello

也许您打算将数字本身显示为字符串,这将是

test n = sequence_ [putStrLn (show i)| i<- [1..n]]

但同样,这样做会更好

test n = mapM_ putStrLn (map show [1..n])

这两个给

Main> test 3
1
2
3

但主要是,您需要做的是首先遵循一个好的介绍性文本。我会推荐Learn You a Haskell for Great Good

如果您编辑问题以使其更清楚您想要什么,这将有很大帮助。你想要什么输出?

于 2012-09-07T15:34:01.013 回答