繁体   English   中英

在haskell中通过可变的对角线长度“绘制”字符/字符串形状

[英]“drawing” char/string shapes by a variable diagonal length in haskell

我正在寻找一个仅通过定义对角线的长度来“绘制”菱形“对象”的函数(将其命名为菱形)(例如:如下所示,因此对角线的长度为5 “ *”,但只有3个可见):

Main> diamond 5

Output:
   *
  ***
 *****
  ***
   *

我有以下功能:

stars x 
    | (x mod 2 == 1) = (firstHalf x) ++ [x] ++ reverse(firstHalf x)
    | otherwise = (firstHalf x) ++ reverse(firstHalf x)`

firstHalf x = take (x div 2) (iterate (2+) 1)

space x = map (div 2) (map ((x+1)-) (stars x))

输出示例:

space 5 = [2,1,0,1,2]
stars 5 = [1,3,5,3,1]

此功能可能有效,但我不知道如何解决此错误:

应用程序中输入错误:

  • 表达式:复制(星号x)['*']
  • 术语:星星x
  • 类型:[Int]
  • 不匹配:整数

diamond x = mapM_ putStrLn $ (replicate (space x) [' ']) ++ (replicate (star x) ['*'])

而且我猜想,即使此错误已解决,也仍需要进行调整,将这两个列表合并以获得所需的结果。 有任何想法吗?

您可以生成许多与明星replicate

ghci> replicate 5 '*'
"*****"

您也可以使用任何其他字符(例如空格( ' ' )来执行此操作。

您可以使用putStrLn在屏幕上打印一行:

ghci> putStrLn (replicate 5 '*')
*****

这是一个生成上面星星的程序:

main = do
    putStrLn $ replicate 2 ' ' ++ replicate 1 '*'
    putStrLn $ replicate 1 ' ' ++ replicate 3 '*'
    putStrLn $ replicate 0 ' ' ++ replicate 5 '*'
    putStrLn $ replicate 1 ' ' ++ replicate 3 '*'
    putStrLn $ replicate 2 ' ' ++ replicate 1 '*'

您可以使用=定义函数:

hello x = putStrLn $ "Hello " ++ x
main = do
    hello "Bob"  -- prints "Hello Bob"

(如果您从ghci提示符下执行此操作,则必须先说出let :例如: let hello x = putStrLn $ "Hello " ++ x

我不知道为什么我在这个问题上花了很多时间,但是我感觉很喜欢。 通常,我们希望问题提供一些证据,证明您在寻求帮助之前已经花费了一些时间来尝试解决问题。 圣诞节快乐...

我把所有的东西都给你了。 现在,您必须将它们放在一起。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM