gpt4 book ai didi

haskell - Haskell 有更好的方法吗?

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

我写了以下内容来帮助孙子们完成家庭教育工作,并通过学习如何编程来保持头脑清醒(我认为 haskell 听起来很棒)。

main :: IO ()
main = do
putStrLn "Please enter the dividend :"
inputx <- getLine
putStrLn "Please enter the divisor :"
inputy <- getLine
let x = (read inputx) :: Int
let y = (read inputy) :: Int
let z = x `div` y
let remain = x `mod` y
putStrLn ( "Result: " ++ show x ++ " / " ++ show y ++ " = " ++ show z ++ " remainder " ++ show remain )

putStrLn ( "Proof: (" ++ show y ++ " x " ++ show z ++ ") = " ++ show (y * z) ++ " + " ++ show remain ++ " = " ++ show ((y * z) + remain))
putStrLn ( "Is this what you had? ")

他们是一种更整洁/更好/更好/更紧凑的方式吗?

最佳答案

它将受益于一个关键原则:尽可能地将纯代码与 IO 分开。这将使您的程序扩展并保持 main 简短。大型 main 中的大量 let 并不是一种非常实用的方法,并且随着代码的增长往往会变得更加困惑。

使用类型签名和本质上是 fmap read getLinereadLn 有助于减少一些麻烦。 (如果您不熟悉 fmap,请访问问题 How do functors work in haskell?fmap 确实是一个非常灵活的工具。)

getInts :: IO (Int, Int)
getInts = do
putStrLn "Please enter the dividend :"
x <- readLn
putStrLn " Please enter the divisor :"
y <- readLn
return (x,y)

现在正在处理。如果我对此类数据进行更多操作,或者更频繁地进行操作,我将使用记录类型来存储被除数、除数、商和余数,因此请记住这一点,以供将来使用,但这在这里有点过分了。

我只是返回一个列表而不是一个元组,所以我可以使用map显示它们:

sums :: (Int, Int) -> [Int]
sums (x,y) = [x, y, q, r, y * q, y * q + r] where
q = x `div` y
r = x `mod` y

拼图的最后一 block 是输出。同样,我更喜欢生成这个外部 IO,然后我可以稍后对其进行 mapM_ putStrLn 来打印每一行。我更喜欢它采用记录类型,但我容忍字符串列表作为输入,因为我假设我已经显示它们全部。

explain :: [String] -> [String]
explain [x,y,q,r,yq,yq_r] =
[ concat ["Result: ", x, " / ", y, " = ", q, " remainder ", r]
, concat ["Proof: (", y, " x ", q, ") + ", r, " = ", yq, " + ", r, " = ", yq_r]
, "Is this what you had? "]

现在我们可以将main写为

main = do (x,y) <- getInts
let ns = map show ( sums (x,y) )
es = explain ns
mapM_ putStrLn es

或者更简洁地,通过将​​函数 explain 连接在一起。 map 显示。 sums,并使用 fmap 将其应用到 getInts 的输出:

main :: IO ()
main = fmap (explain . map show . sums) getInts
>>= mapM_ putStrLn

您可能会注意到,我在证明中添加了 +r 以使 = 始终表示 =,这是正确的数学用法,镜像的 Haskell 含义为=。

关于haskell - Haskell 有更好的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25678858/

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