我不知道为什么这段代码没有运行。我只是想用像4这样的数字填充0并返回结果。我是Haskell的新人,如果我的问题很基本,那就很抱歉。
fill [] = []
fill (x:xs) = if x==0 then 0 else 4 : fill xs
main = do
fill [0,1,0]
答案 0 :(得分:2)
让我们看看编译器在看到你的函数fill
时实际看到了什么:
(我现在没有ghc可供使用,但它看起来应该如下所示)
> :t fill
fill :: (Num a) => [a] -> [a] -- or fill:: [Integer] -> [Integer] for simplicity
好的,这是一个函数,它使用数字列表返回另一个数字列表。我们来看看main:
> :t main
main :: IO ()
等等,IO
做什么?那么,main
是所有独立haskell程序的入口点。它将您的功能暴露在由命名不佳的IO
包装器建模的现实世界中。
现在,你真的想在这里完成什么?
我只是想用一个像4这样的数字填充0并返回 结果
是的,让我们开始吧。这是我的类型定义 - 我只是说,无论我在这里得到的列表类型是什么,都以a
为特征 - 它应该符合数字,这就是我的意思为什么我将类型限制为{{ 1}}。 Num
这是一个类型类,您可以更多地了解here。
Num
现在,当我看到一个空列表时,我返回一个空列表。容易 -
fill :: (Num a) => [a] -> [a]
在你的函数定义中,你根本不会替换零 - 让我们解决这个问题:
fill [] = []
好的,我们还没有在这里完成 - 我们如何向外界展示fill (x:xs) = if x == 0
then 4:fill xs
else x:fill xs
?来到主,来到世界。 Cheesy,我知道:-)但是fill
将所有东西都包装成main
,我们如何将我们的小函数包装进去呢?啊,如何在IO
中显示字符串? putStrLn
or print
?
IO
我们现在安全地在我们的小回声室中冥思自己,向自己嘀咕“你好世界”。 让它更有用。现在,我打算打印出我们的清单:
main :: IO ()
main = putStrLn "Hello World!"
与> :t print
print :: Show a => a -> IO ()
一样,Num
也是另一个类型类。我让你把这看作是作业。 : - )
Show
打印:
main = print $ fill [0,1,0,1]
答案 1 :(得分:0)
这应该有效:
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
用于获取一个类型并返回它的String等价物,以便它可以在do块中打印。
答案 2 :(得分:0)
将if-then-else
括在括号中:
fill [] = []
fill (x:xs) = (if x==0 then 0 else 4) : fill xs