我不知道为什么这段代码不运行。我只是想用像 4 这样的数字填充 0 并返回结果。如果我的问题非常基本,我是 Haskell 的新手。
fill [] = []
fill (x:xs) = if x==0 then 0 else 4 : fill xs
main = do
fill [0,1,0]
让我们看看编译器在看到你的函数时实际上在看什么fill
:(我现在没有 ghc 可供我使用,但它应该如下所示)
> :t fill
fill :: (Num a) => [a] -> [a] -- or fill:: [Integer] -> [Integer] for simplicity
好的,这是一个使用数字列表返回另一个数字列表的函数。让我们看看主要的:
> :t main
main :: IO ()
等等,那里在IO
做什么?好吧,main
所有独立的 haskell 程序的入口点。它将您的函数公开到由名称不佳的IO
包装器建模的现实世界中。
现在,你到底想在这里完成什么?
我只是想用像 4 这样的数字填充 0 并返回结果。
好吧,让我们开始吧。这是我的类型定义——我要说的是,无论我在这里得到什么类型的列表,其特征是a
——它应该符合数字,这就是我将类型限制为Num
. Num
这是一个类型类,您可以在此处查看更多信息。
fill :: (Num a) => [a] -> [a]
现在,当我看到一个空列表时,我返回一个空列表。简单的 -
fill [] = []
在您的函数定义中,您根本没有替换零 - 让我们解决这个问题:
fill (x:xs) = if x == 0
then 4:fill xs
else x:fill xs
好的,我们还没有在这里完成 - 我们如何暴露fill
于我们的外部世界?主要来了,世界来了。俗气,我知道 :-) 但是main
将所有内容都包装成一个IO
,我们如何将我们的小函数包装成它?啊,我如何将字符串显示到 中IO
?putStrLn
还是print
?
main :: IO ()
main = putStrLn "Hello World!"
我们现在安全地躲在我们的小回音室里,自言自语着“你好世界”。让我们让它更有用一点。现在,我将打印出我们的列表:
> :t print
print :: Show a => a -> IO ()
Like Num
,Show
也是另一个类型类。我让你把这当作家庭作业。:-)
main = print $ fill [0,1,0,1]
打印:
[4,1,4,1]
只需if-then-else
用括号括起来:
fill [] = []
fill (x:xs) = (if x==0 then 0 else 4) : fill xs
这应该有效:
fill [] = []
fill (x:xs) = if x==0
then 4:fill xs
else x:fill xs
main = do
putStrLn $ show (fill [0,1,0])
当您检查 0 时,您不应该返回0
,而是应该递归0
调用该函数。fill
在 main 函数中,show
用于获取一个类型并为其返回等效的字符串,以便可以在 do 块中打印它。