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

String 在haskell中通过可变对角线长度“绘制”字符/字符串形状,string,haskell,char,String,Haskell,Char,我正在寻找一个函数,我们将其命名为diamond,它通过仅定义菱形对象的对角线长度来绘制菱形对象,例如:如下所示,因此在本例中,对角线的长度为5*但只有3个可见: Main> diamond 5 Output: * *** ***** *** * 我有以下职能: stars x | (x mod 2 == 1) = (firstHalf x) ++ [x] ++ reverse(firstHalf x) | otherwise = (firstH

我正在寻找一个函数,我们将其命名为diamond,它通过仅定义菱形对象的对角线长度来绘制菱形对象,例如:如下所示,因此在本例中,对角线的长度为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] 不匹配:Int 菱形x=mapM_uuputstrln$复制空间x['']++复制星x['*']


我想即使这个错误被修复了,它仍然需要一个调整,将这两个列表连接起来,以获得所需的结果。有什么想法吗?

您可以通过复制生成许多星星:

您还可以对任何其他字符(如空格“”)执行此操作

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

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

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 '*'
您可以使用=定义函数:

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

我不知道为什么我在这个问题上花了这么多时间,但我感觉很好。通常,我们希望问题能够提供一些证据,证明您在寻求帮助之前花了一些时间试图解决问题。圣诞快乐


我已经把所有的碎片都给你了。现在,您必须将它们放在一起。

您可以通过复制生成多个星星:

您还可以对任何其他字符(如空格“”)执行此操作

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

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

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 '*'
您可以使用=定义函数:

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

我不知道为什么我在这个问题上花了这么多时间,但我感觉很好。通常,我们希望问题能够提供一些证据,证明您在寻求帮助之前花了一些时间试图解决问题。圣诞快乐


我已经把所有的碎片都给你了。现在你必须把它们放在一起。

我是哈斯克尔的新手,我主要在算术基础上工作,我对这些类型的函数不太熟悉等等。如果你能告诉我一个基本的想法,如何通过一些数学计算写出一行星星,如果你知道我的意思,在输出上加上字符串。如果这是家庭作业,请加上家庭作业标签。我们仍然会尝试给出一些答案,但会调整我们的回答方式,以避免做可能违反你们学校行为准则的事情,避免给你们带来麻烦。别担心,这不是家庭作业,但谢谢你们。你们越来越近了,@baron。看看mapM_和zip——它们可以让你在列表中进行迭代,并对每一对执行一个操作。我正在尝试,但我仍然不知道如何将所有这些函数组合在一起使其工作。我更新了上面的问题,看看我到目前为止的进展。感谢您的耐心和帮助@luqui。我是haskell的新手,我主要是在算术基础上工作,我对这些类型的函数不太熟悉等等。如果你能告诉我一个基本的想法,如何通过一些数学计算写出一行星星,如果你知道我的意思,在输出上加上字符串。如果这是家庭作业,请加上家庭作业标签。我们仍然会尝试给出一些答案,但会调整我们的回答方式,以避免做可能违反你们学校行为准则的事情,避免给你们带来麻烦。别担心,这不是家庭作业,但谢谢你们。你们越来越近了,@baron。看看mapM_和zip——它们可以让你在列表中进行迭代,并对每一对执行一个操作。我正在尝试,但我仍然不知道如何将所有这些函数组合在一起使其工作。我更新了上面的问题,看看我到目前为止的进展。感谢您的耐心和帮助@luqui。非常感谢。非常感谢。我要寻找的最后一件事是,有没有一种方法可以借助这些函数来绘制这个图:stars x | x mod 2==1=firstHalf x++[x]++reversefirstHalf x |否则=firstHalf x++reversefirstHalf x firstHalf x=take x div 2迭代2+1空间x=map div 2 map x+1-stars x然后:space 5=[2,1,0,1,2]stars 5=[1,3,5,3,1]有没有办法从这两个列表中打印出上面的形状?我的基本想法是:putStrLn$replicate[2,1,0,1,2]''++replicate 1'*'[1,3,5,3,1]-直到列表为空。非常感谢。我要找的最后一件事是,有没有一种方法可以借助这些函数来绘制此图:stars x | x mod 2==1=firstHalf x++[x]++reversefirstHalf x |否则=上半部分x++reversefirstHalf x上半部分x=取x div 2迭代2+1空间x=映射div 2映射x+1-星x然后:空间5=[2,1,0,1,2]星5=[1,3,5,3 ,1]有没有办法从这两个列表中打印上面的形状?我的基本想法是:putStrLn$replicate[2,1,0,1,2]'++replicate 1'*'[1,3,5,3,1]——直到列表为空
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"