如何在haskell中生成字母矩阵

时间:2014-07-26 18:06:23

标签: haskell

用户必须键入维度(它是二次矩阵),并生成随机字母。 例如:生成Matrix 3

[('a', 'f', 'j'), ('t', 'a', 'b'), ('c', 'y', 'k')]

每个元组都是一行

2 个答案:

答案 0 :(得分:5)

实现你正在寻找的随机性对初学者来说不是一项小任务,但假设你了解Haskell的基础知识,LYAH关于随机性的部分应该可以帮到你很多。

http://learnyouahaskell.com/input-and-output#randomness

特别是,您可能会发现randomRs函数很有用:

ghci> take 10 $ randomRs ('a','z') (mkStdGen 3) :: [Char]
"ndkxbvmomg"

但是为了成功地在应用程序中使用它,你应该知道更多关于Haskell中的随机性和处理杂质,所以你真的应该阅读整个部分。

关于你的问题需要注意的另一件事是[(Char,Char,Char)]和[(Char,Char,Char,Char)]是不同的类型,所以没有简单的方法让单个函数返回列表根据输入大小不同长度的元组。对于你正在做的事情,你可能想要一个列表列表。

答案 1 :(得分:1)

使用元组,如果没有手动对解决方案进行硬编码,这是不可能的,这就是为什么最简单的是使用列表列表来表示矩阵,如果维度应该是可变的。

然后你可以尝试这样的事情:

import System.Random

genMatrix n = format n n (take (n*n) (randomRs ('a','z') (mkStdGen (n*n))))
  where
    format _ 0 _ = []
    format n m text = (take n text) : format n (m-1) (drop n text)

genMatrix获取行数和列数以及“随机”字符串,然后由format格式化。它只是将列表拆分为长度为n的部分,并将它们分配到空列表中。

示例:

*Main> genMatrix 3
["nmq","jfj","oih"]