[英]Haskell recursion “:” replaced by || why?
我有一个问题,为什么这个函数不能与“:”一起使用,但与||一起使用 为什么“:”被||取代 我的意思是为什么不能写
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 + 5
是Int
并且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.