4 Stimmen

Was kann an meinem ersten Haskell-Programm verbessert werden?

Hier ist mein erstes Haskell-Programm. Welche Teile würden Sie besser schreiben?

-- Multiplikationstabelle
-- Gibt n*n Multiplikationstabelle zur Basis b zurück

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

-- Gibt n*n Multiplikationstabelle zur Basis b zurück
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 " "

1voto

Dan Punkte 10758

Ein kurzer Kommentar, der sagt, was jede Funktion tut, ihre Argumente und Rückgabewert ist immer gut. Ich musste den Code ziemlich sorgfältig lesen, um ihn vollständig zu verstehen.

Einige würden sagen, wenn Sie das tun, sind explizite Typsignaturen möglicherweise nicht erforderlich. Das ist eine ästhetische Frage, dazu habe ich keine starke Meinung.

Ein kleiner Vorbehalt: Wenn Sie die Typsignaturen entfernen, erhalten Sie automatisch die polymorphe Integral -Unterstützung, die ephemient erwähnt hat, aber Sie werden immer noch eine um toAlphaDigits benötigen aufgrund der berüchtigten "Monomorphismusbeschränkung".

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X