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,我是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:

我是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:y)
    做什么?我知道
    (x:xs)
    将允许您抓住头部或尾部,但是
    y
    变量中有什么
  • 箭能做什么<代码>->ux
    • 所有的问题都很好

      • l@
        做什么
      这就是所谓的as模式。它为整个图案命名
      l@(x:)
      是一种模式,它将列表与至少一个元素相匹配。它命名列表的头部
      x
      ,丢弃列表的尾部,并命名整个列表(即表达式
      x:
      l

      • dropWhile(/=e)l of
        代表什么,尤其是
        /=
        操作符
      Haskell是如何拼写“不相等”的。它与
      相同=在例如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请参阅我的编辑,我已经修复了您原始函数中的几个错误:)