Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 实现最后一个函数_Haskell - Fatal编程技术网

Haskell 实现最后一个函数

Haskell 实现最后一个函数,haskell,Haskell,我在努力自学哈斯克尔。我尝试过的一件事是编写一个替代函数来返回列表的最后一个元素,方法是在列表中递归,直到尾部为空集,然后返回头部。我有 mylast [] = [] mylast (x:[]) = x mylast (x:xs) = mylast xs …但我在尝试任何非空列表时出错:( 关于我做错了什么有什么建议吗? TIA.请尝试mylast[]=error“Empty list!”。否则Haskell无法推断您的函数类型。EFraim的解决方案应该可行(得票最多)。但我认为这更像“Ha

我在努力自学哈斯克尔。我尝试过的一件事是编写一个替代函数来返回列表的最后一个元素,方法是在列表中递归,直到尾部为空集,然后返回头部。我有

mylast [] = []
mylast (x:[]) = x
mylast (x:xs) = mylast xs
…但我在尝试任何非空列表时出错:( 关于我做错了什么有什么建议吗?
TIA.

请尝试
mylast[]=error“Empty list!”
。否则Haskell无法推断您的函数类型。

EFraim的解决方案应该可行(得票最多)。但我认为这更像“Haskell”:

免责声明:我实际上没有尝试过。我可能犯了语法错误。

与学习Haskell时的许多其他问题一样,问题在于键入。在GHCi中键入以下内容

:t mylast
您将看到类型签名是

mylast :: [[a]] -> [a]
它需要一个列表并将返回一个列表。因此,如果您输入字符串列表[“bob”、“fence”、“house”],该函数将按照您编写的方式工作

问题是您的基本情况:mylast[]=[],它告诉编译器您想要返回一个列表。您想要返回一个元素,而不是列表。但是Haskell中没有空元素(很大程度上是设计出来的),因此您需要使用Maybe monad

mylast :: [a] -> Maybe a
mylast [] = Nothing
mylast (x:[]) = Just x
mylast (x:xs) = mylast xs
monad是一个有点抽象的主题,但是当你开始使用monad时,你需要知道的是它是一个类型声明,告诉编译器期望两种可能性:“Nothing”或“Just x”。然后返回的代码可以使用x运行,但是如果你不使用“Just”,编译器会抱怨

另一种方法是在遇到空列表时抛出错误,如下所示:

mynextlast [] = error "no empty lists allowed"
mynextlast (x:[])  = x
mynextlast (x:xs) = mynextlast xs

但我的怀疑是,也许这才是正确的选择。

谢谢大家的回答。我已经试过了

mylast :: [a] -> Maybe a 
mylast [] = Nothing 
mylast (x:[]) = Just x 
mylast (x:xs) = mylast xs 
我得到了

Main> mylast3 [2,4,66,5,4,33] 
Just 33 :: Maybe Integer 
有没有办法让它不打印答案中的“just”

[编辑:Jörg W Mittag](评论对于发布代码来说非常糟糕…)

以下是整个代码在上下文中的外观:

mylast []     = Nothing
mylast [x]    = Just x
mylast (x:xs) = mylast xs

mylook (Just a) = do print a
mylook Nothing  = do error "Nothing to see here, move along!"

mylook $ mylast [2,4,66,5,4,33]

递归调用解决方案

从中得到的一个教训是,指定您定义的内容类型非常有用。这将使编译捕获像这样的错误..谢谢大家的回答。我已经尝试了…mylast3::[a]->可能是一个mylast3[]=无mylast3(x:[])=只有x mylast3(x:xs)=mylast3 xs,我得到例如…Main>mylast3[2,4,66,5,4,33]只有33::也许整数是为了让它不打印“Just”?谢谢大家的答案。我已经尝试过…mylast3::[a]->可能是mylast3[]=没有mylast3(x:[])=只有x mylast3(x:xs我得到例如…Main>mylast3[2,4,66,5,4,33]Just 33::Maybe Integer可以让它不打印'Just'?willingly950:一种方法是使用Data.Maybe.fromJust。当它不存在时,它会抛出一个异常。中间的大小写与[x]相同,对吗?瞧,通过将x与空列表(x:[])连接而创建的单元素列表与只包含x“[x]”的列表相同。但我不知道哪一个更为惯用。不,只是x与[x]不同。@rtperson-如果x代表列表,那么[x]仍然是一个单元素列表,其中一个元素恰好是一个列表,不是吗?该死,我真的需要让我的Haskell环境重新启动并运行。@Jorg-['a']和[1]上的类型签名分别是['a']:[Char]和[1]:(Num t)=>[t]。它们都对我说“什么列表”但我只是在函数中按你的方式尝试了它,它很有效,所以你是对的。就我个人而言,我仍然会使用串联,只是为了让基本意图更清楚。@Jorg-是的,
[x]
始终是一个单元素列表。可能是Monad的要点(以及它与C中的空指针或Java中的空引用的区别),即类型签名显式地强制您处理两种情况:返回了某个内容而未返回任何内容。因此,您必须显式地对这两种情况进行模式匹配,并分别处理它们。例如,如果要打印结果:mylook(Just a)=do print a!NEWLINE!mylook nothing=do error“这里没什么可看的,请继续!”!新行!mylook$mylast[2,4,66,5,4,33]
x“fromJust$mylast[2,4,66,5,4,33]”怎么样?(fromJust是从数据导入的。也许)您应该接受rtperson答案…为您的答案添加更多上下文来解释它在做什么。
mylast []     = Nothing
mylast [x]    = Just x
mylast (x:xs) = mylast xs

mylook (Just a) = do print a
mylook Nothing  = do error "Nothing to see here, move along!"

mylook $ mylast [2,4,66,5,4,33]
myLast' [] = error "no empty lists allowed"
myLast' [a] = a
myLast' xs = xs !! (length xs - 1)
mylast [x] = x
mylast (x:xs) = mylast xs