Haskell下面的函数做什么?
我是haskell的新手,但幸运的是,我只需要实现几个函数。 我确实对以下函数有疑问Haskell下面的函数做什么?,haskell,Haskell,我是haskell的新手,但幸运的是,我只需要实现几个函数。 我确实对以下函数有疑问 next :: Eq a => [a] -> a -> a next l@(x:_) e = case dropWhile (/= e) l of (_:y:_) -> y _ -> x l@做什么 dropWhile(/=e)l of代表什么,尤其是/=操作符 在这种情况下,的是什么意思 (\uy:
next :: Eq a => [a] -> a -> a
next l@(x:_) e = case dropWhile (/= e) l of
(_:y:_) -> y
_ -> x
做什么l@
代表什么,尤其是dropWhile(/=e)l of
操作符/=
- 在这种情况下,的
是什么意思
做什么?我知道(\uy:y)
将允许您抓住头部或尾部,但是(x:xs)
变量中有什么y
- 箭能做什么<代码>->ux
做什么l@
- 所有的问题都很好
l@(x:)
是一种模式,它将列表与至少一个元素相匹配。它命名列表的头部x
,丢弃列表的尾部,并命名整个列表(即表达式x:
)l
代表什么,尤其是dropWhile(/=e)l of
操作符/=
相同=代码>在例如Java中。语法(/=e)
,其中中缀运算符在括号中有一个参数,称为节。它代表(\x->x/=e)
。所以dropWhile(/=e)l
从l
中删除元素,只要它们不等于e
- 在这种情况下,
的是什么意思
这只是case
表达式语法的一部分。它将scrutinee与分支分开:
case foo of
bar -> ...
baz -> ...
...
(\uy:y)
做什么?我知道(x:xs)
将允许您抓住头部或尾部,但是y
变量中有什么
这只是一个更复杂的模式。在本例中,它将列表与至少两个元素进行匹配,并将第二个元素命名为y
x:xs
将头部和尾部分开x:(y:ys)
将前两个元素与其余元素分开。因为(:)
是右关联的,所以可以去掉括号(x:y:ys
),而\uu
的意思就是“我对此不感兴趣”
- 箭能做什么<代码>->ux
同样,它只是case
表达式语法的一部分。它将模式与返回值分开。在这种情况下,该模式是一个全面通配符模式,返回值为x
总而言之:此函数应该在
l
中查找e
,并返回以下元素。这就是说,这不是一个特别伟大的想法实施。我发现了两个特别的问题
下一个的声明中没有[]
大小写子句<代码>下一步
是部分功能
dropWhile(/=e)l
没有返回至少包含两个元素的列表(因此\uuuu1:y:
模式不匹配),它将返回列表的第一个元素x
。(如果列表中缺少e
,或者它是最后一个元素,则可能发生这种情况。)这似乎是一件非常奇怪的事情l
的下一个元素的可能性来解决这个问题e
可能是l
的最后一个元素,也可能根本不在l
中。这是该函数含义的一个基本部分,而不仅仅是实现中的一个bug,因此我们应该在类型中说明它
next :: Eq a => [a] -> a -> Maybe a
通过给next
一个返回类型可能是一个,我表示它可能不会返回任何东西
next l e = case dropWhile (/= e) l of
(_:x:_) -> Just x
_ -> Nothing
所以这个实现说:如果dropWhile(/=e)l
返回至少两个元素的列表,则返回第二个元素。(我正在使用Just::a->Maybe a
将值包装成Maybe
)否则将返回Nothing
不用太担心这个问题,但是为了它的价值,我们可以使用Haskell更高级的功能之一将这个函数稍微缩短一点。ViewPatterns
语言扩展旨在简化像这样的函数,这些函数只对次要值执行case
分析
{-# LANGUAGE ViewPatterns #-}
next :: Eq a => a -> [a] -> Maybe a -- I've flipped the arguments
next e (dropWhile (/= e) -> _:x:_) = Just x
next _ _ = Nothing
我不知道课程(?)是如何组织的,但如果这是第一个示例之一,那么课程可能应该进行一些重组,因为它一次引入了太多的概念。这个问题是11分钟前提出的,3分钟前我们得到了非常棒的答案:)@GeorgeMorris请参阅我的编辑,我已经修复了您原始函数中的几个错误:)