简单的Haskell代码数字列表

时间:2013-10-10 05:42:46

标签: list haskell

我不知道为什么这段代码没有运行。我只是想用像4这样的数字填充0并返回结果。我是Haskell的新人,如果我的问题很基本,那就很抱歉。

fill [] = []
fill (x:xs) = if x==0 then 0 else 4 : fill xs

 main = do
  fill [0,1,0]

3 个答案:

答案 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