0

我不知道为什么这段代码不运行。我只是想用像 4 这样的数字填充 0 并返回结果。如果我的问题非常基本,我是 Haskell 的新手。

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

 main = do
  fill [0,1,0]
4

3 回答 3

2

让我们看看编译器在看到你的函数时实际上在看什么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,我们如何将我们的小函数包装成它?啊,我如何将字符串显示到 中IOputStrLn还是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]
于 2013-10-10T06:20:25.473 回答
0

只需if-then-else用括号括起来:

fill [] = []
fill (x:xs) = (if x==0 then 0 else 4) : fill xs
于 2013-10-10T06:01:41.783 回答
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用于获取一个类型并为其返回等效的字符串,以便可以在 do 块中打印它。

于 2013-10-10T05:57:29.907 回答