2017-10-12 79 views
1

我是haskell的新手,负责创建一个函数,它接受一个int和一个int列表,函数会查找输入的ints位置并返回它之前的值,例如fn 5 [1,2,3,4,5,6]会返回4.我有很多问题入门。首先我不断收到变量不在范围错误。Haskell递归函数和语法

fn' ::Int->[Int]->Int 
fn' y [] = -1 
fn' y (x:xs) 
    |y = (head listail) = x 
    |otherwise = listail 
    where listail = fn' y (tail)xs 

我应该从哪里开始看,而且一般情况下还有其他事情我应该或不应该做?

亚当斯代码错误

main.hs:3:31: error: 

• Couldn't match expected type ‘Int’ with actual type ‘[Int]’ 
• In the expression: fn y x2 : xs 
    In an equation for ‘fn’: 
     fn y (x1 : x2 : xs) 
     | y == x2 = x1 
     | otherwise = fn y x2 : xs 
main.hs:3:36: error: 
• Couldn't match expected type ‘[Int]’ with actual type ‘Int’ 
• In the second argument of ‘fn’, namely ‘x2’ 
    In the first argument of ‘(:)’, namely ‘fn y x2’ 
    In the expression: fn y x2 : xs 
<interactive>:3:1: error: 
• Variable not in scope: main 
• Perhaps you meant ‘min’ (imported from Prelude) 
+0

什么是'findNext''? –

+0

由于您没有列出错误信息,所以难以说出您的问题所在,但我保证您的“变量不在范围内”是来自“findNext”错字。注:也是'y =(head listail)'是赋值。你想'y ==(head listail)'(尽管'listail'似乎被定义为错误。) –

回答

3

您可以使用模式匹配从列表中抢出两个值并加以比较。

fn :: Int -> [Int] -> Int 
fn y (x1:x2:xs) | y == x2 = x1 
       | otherwise = fn y (x2:xs) 
fn _ _ = -1 

注意我的最后一种情况 - 这是失败的情况下,当你无法匹配的模式(x1:x2:xs)

或者:(x1:x2:xs)也可拼写成(x1:[email protected](x2:_))。后者模式是更复杂的阅读,但让你做:

fn :: Int -> [Int] -> Int 
fn y (x1:[email protected](x2:_)) | y == x2 = x1 
        | otherwise = fn y xs 
fn _ _ = -1 

,而不是重新加入x2xs递归。

Try it online!


由于Gallais的在评论中指出:

注意,此功能可以采取更多的多晶型Eq a => a -> [a] -> a。这仅仅是一个变化的类型签名

fn :: Eq a => a -> [a] -> a 

这允许您使用fn与其他有用的类型,即fn '#' "I'm #1!"'1'

而且,这里一个更好的返回值可能是一个Maybe Int(或一个Maybe a多态形式),因为你会有一些不包含搜索词的列表。

fn :: Eq a => a -> [a] -> Maybe a 
fn y (x1:[email protected](x2:_)) | y == x2 = Just x1 
        | otherwise = fn y xs 
fn _ _ = Nothing 
+0

由于学校的限制,我目前使用的是haskell的在线ide,我仍然给了我一个“Variable not in scope error “以及”无法匹配类型“Int”与“[Int] - > Int”消息。这只是我的IDE的错误b/c,如果这是我的原始代码做什么? – STRAN

+0

@STRAN不知道你在说什么变量,你正在使用什么IDE,以及运行什么代码(以及如何)都无法分辨出来。 –

+0

即时通讯使用repl.it,我试图运行你的代码,我编辑错误消息到后 – STRAN