所以我需要做一个find2方法,将第一个Element取出。
例如 find2 :: (a -> Bool) -> [a] -> a
和 find2 (>4) [1 .. 10]
应该有一个输出 5
我对Haskell不好,但是我想学习。
我的第一次尝试是
find2 :: (a -> Bool) -> [a] -> a
find2 p [] = []
find2 p (x:xs)
|p x = x+1
|otherwise = finde p xs
但是我遇到一个错误
* Couldn't match expected type `a' with actual type `[a0]'
`a' is a rigid type variable bound by
the type signature for:
find2 :: forall a. (a -> Bool) -> [a] -> a
at C:\\Users\XY\Desctop\XY.hs:30:1-32
* In the expression: []
In an equation for `find2': find2 p [] = []
* Relevant bindings include
p :: a -> Bool
(bound at C:\\Users\XY\Desctop\XY.hs:31:7)
find2 :: (a -> Bool) -> [a] -> a
(bound at C:\\Users\XY\Desctop\XY.hs:31:1)
这里有问题。有可能不会在你的列表中的值,其中p成立。返回空列表时,可以在函数的基本情况下看到该问题。但是,您声明了函数以返回单个a
值,而不是列表。
因此,您需要一种将找到的值与空值区分开的方法。为此,您可以声明要返回的函数,Maybe a
而不是a
。这样,当您到达空列表大小写时,您可以返回Nothing
;如果找到了所要查找的元素,则可以返回Just x
。它看起来像这样:
find2 :: (a -> Bool) -> [a] -> Maybe a
find2 p [] = Nothing
find2 p (x:xs)
|p x = Just x
|otherwise = find2 p xs
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句