gpt4 book ai didi

haskell - 我的第一个 Haskell 程序有哪些可以改进的地方?

转载 作者:行者123 更新时间:2023-12-02 02:06:14 25 4
gpt4 key购买 nike

这是我的第一个 Haskell 程序。您会以更好的方式编写哪些部分?

-- Multiplication table
-- Returns n*n multiplication table in base b

import Text.Printf
import Data.List
import Data.Char

-- Returns n*n multiplication table in base b
mulTable :: Int -> Int -> String
mulTable n b = foldl (++) (verticalHeader n b w) (map (line n b w) [0..n])
where
lo = 2* (logBase (fromIntegral b) (fromIntegral n))
w = 1+fromInteger (floor lo)

verticalHeader :: Int -> Int -> Int -> String
verticalHeader n b w = (foldl (++) tableHeader columnHeaders)
++ "\n"
++ minusSignLine
++ "\n"
where
tableHeader = replicate (w+2) ' '
columnHeaders = map (horizontalHeader b w) [0..n]
minusSignLine = concat ( replicate ((w+1)* (n+2)) "-" )

horizontalHeader :: Int -> Int -> Int -> String
horizontalHeader b w i = format i b w

line :: Int -> Int -> Int -> Int -> String
line n b w y = (foldl (++) ((format y b w) ++ "|" )
(map (element b w y) [0..n])) ++ "\n"

element :: Int -> Int -> Int -> Int -> String
element b w y x = format (y * x) b w

toBase :: Int -> Int -> [Int]
toBase b v = toBase' [] v where
toBase' a 0 = a
toBase' a v = toBase' (r:a) q where (q,r) = v `divMod` b

toAlphaDigits :: [Int] -> String
toAlphaDigits = map convert where
convert n | n < 10 = chr (n + ord '0')
| otherwise = chr (n + ord 'a' - 10)

format :: Int -> Int -> Int -> String
format v b w = concat spaces ++ digits ++ " "
where
digits = if v == 0
then "0"
else toAlphaDigits ( toBase b v )
l = length digits
spaceCount = if (l > w) then 0 else (w-l)
spaces = replicate spaceCount " "

最佳答案

以下是一些建议:

  • 为了使计算的表格性更加明显,我会将列表 [0..n] 传递给 line 函数,而不是传递 n

  • 我将进一步拆分水平轴和垂直轴的计算,以便将它们作为参数传递给 mulTable,而不是在那里计算。

  • Haskell 是高阶的,几乎所有计算都与乘法无关。因此,我将 mulTable 的名称更改为 binopTable 并将实际的乘法作为参数传递。

  • 最后,个别数字的格式是重复的。为什么不将 \x -> format x b w 作为参数传递,从而消除对 bw 的需要?

我建议的更改的最终效果是您构建一个通用的高阶函数来为二元运算符创建表。它的类型变成类似

binopTable :: (i -> String) -> (i -> i -> i) -> [i] -> [i] -> String

您最终会得到一个可重用性更高的函数 - 例如, bool 真值表应该是小菜一碟。

高阶且可重用是 Haskell 之道。

关于haskell - 我的第一个 Haskell 程序有哪些可以改进的地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1970645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com