繁体   English   中英

Haskell递归“:”替换为|| 为什么?

[英]Haskell recursion “:” replaced by || why?

我有一个问题,为什么这个函数不能与“:”一起使用,但与||一起使用 为什么“:”被||取代 我的意思是为什么不能写

包含xs(y:ys)=前缀xs(y:ys):包含xs ys

 contains :: String -> String -> Bool
 contains [] _ = True
 contains _ [] = False
 contains xs (y:ys) = prefix xs (y:ys) || contains xs ys

关键的想法

使用:建立一个列表答案, || &&建立一个真/假答案, +*来建立一个数字答案。 想想你正在结合什么 - 它不一定是:所有的时间。

详情

我想你的意思是问为什么你不能写

contains xs (y:ys) = prefix xs (y:ys)  :  contains xs ys

:用于将元素粘贴到列表的前面,因此它具有类型a -> [a] -> [a] 这意味着您在左侧放置一个东西,在右侧放置一个列表。 您经常在编写递归函数时使用它,例如,您可以定义

increase :: [Int] -> [Int]
increase [] = []
increase (x:xs) = x + 5 : increase xs

这里x + 5Int并且increase xs[Int]

我们来看看你的功能吧。 它的类型是contains :: String -> String -> Bool所以它需要一个String,然后是一个String,然后给你一个Bool。 =之后直接得到prefix xs (y:ys) 现在prefix具有相同的类型: prefix :: String -> String -> Bool ,所以现在我们给它xs(y:ys)它给了我们一个Bool。

在我们已经得到了线的末端contains xs ys这是一个布尔值,所以,如果我们把:他们之间我们已经得到的东西有点像

False : True

但我们不允许这样做,因为True不是一个列表。 (记住(:) :: a -> [a] -> [a] 。)你可以做False:[True] (这将是[False,True] ,但这不是你想要的。

您需要检查xs是否存在 - 在(y:ys)的前面稍后。 的符号是|| 所以代码说

xs(y:ys)如果它在它的前面( prefix xs (y:ys) )或它在ys的某个地方( contains xs ys )。

随着: (把功能于前面的符号)在它,它会说

xs(y:ys)如果它在它的前面( prefix xs (y:ys) ),把答案放在这些答案的前面 - 它在ys的某个地方( contains xs ys )。

这没有意义。 这就是为什么你需要或( || )不-前的( : )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM