You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell如何实现多个自定义三角形在同一行并排打印输出

实现思路

你思路的方向是对的,核心就是先统一三个三角形的高度,再按行横向拼接即可,具体实现逻辑如下:

  1. 编写辅助函数补全每个三角形的高度:以三个三角形的最大高度为基准,给高度不足的三角形顶部补对应数量的全空格行,保证三个三角形行数相同
  2. 用zipWith3将三个三角形的对应行拼接,行之间可加自定义数量的空格做间隔
  3. 最后将拼接好的行统一用unlines输出

完整实现代码

import Data.List ( intersperse, zipWith3 )

type Triangle = Char -> Int -> [String]

centeredTriangle :: Triangle
centeredTriangle c n = [replicate (n-i) ' ' ++ intersperse ' ' (replicate i c) | i <- [0 .. n]]

-- 辅助函数:将三角形补全到指定高度,顶部补空格行
padTriangle :: Int -> [String] -> [String]
padTriangle targetHeight tri = 
    let currentHeight = length tri
        -- 计算需要补的行数
        padLineCount = targetHeight - currentHeight
        -- 取三角形底行的长度作为补全行的长度,保证对齐
        lineWidth = length $ last tri
        padLines = replicate padLineCount (replicate lineWidth ' ')
    in padLines ++ tri

triangles :: Int -> Int -> Int -> IO()
triangles a b c = do 
    let t1 = centeredTriangle '*' a
        t2 = centeredTriangle '*' b
        t3 = centeredTriangle '*' c
        -- 取三个三角形的最大高度作为统一高度
        maxH = maximum [length t1, length t2, length t3]
        -- 补全所有三角形到统一高度
        paddedT1 = padTriangle maxH t1
        paddedT2 = padTriangle maxH t2
        paddedT3 = padTriangle maxH t3
        -- 按行拼接,中间加4个空格做间隔,可按需调整间隔大小
        combinedLines = zipWith3 (\x y z -> x ++ "    " ++ y ++ "    " ++ z) paddedT1 paddedT2 paddedT3
    putStr $ unlines combinedLines

使用说明

在GHCI中执行triangles 1 2 3即可得到你期望的横向并排效果,如果不需要最顶部的全空行,将最后一行输出代码改为putStr $ unlines $ tail combinedLines即可。

内容的提问来源于stack exchange,提问作者Mampenda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:36:01