【问题标题】:Getting parse error on using head function on a list in haskell在haskell中的列表上使用head函数时出现解析错误
【发布时间】:2025-12-16 22:35:03
【问题描述】:

我有一个函数,ground n p,有两个输入参数 n 和 p,返回如下:[[1,0,1],[0,0,1],[1,1,1]]。我正在执行以下操作以获取此列表列表的头部并进行计算。

enter =
  lst <- head (ground)
  map (\x -> if (x == 0) then 2 else x) lst

但是,我收到以下错误:输入“

为什么会这样?

我是 Haskell 新手,刚刚开始学习它。

【问题讨论】:

    标签: haskell compiler-errors


    【解决方案1】:

    &lt;-do 表示法中用于单子。 我想你想要的是这样的:

    enter ground =
      let lst = head ground
      in map (\x -> if (x == 0) then 2 else x) lst
    

    这里我使用通常的let ... in ... 语法来定义lst = head ground - 当然ground 必须在其他地方定义。因为我没有看到它,所以我将 enter 变成了一个将它作为参数的函数。

    或者使用函数ground(你的评论)

    enter =
      let lst = head . ground $ yourArgumentsForGroundHere
      in map (\x -> if (x == 0) then 2 else x) lst
    

    另一种选择是:

    enter (lst:_) =
      map (\x -> if (x == 0) then 2 else x) lst
    

    这里我使用模式匹配从enter的参数中取出lst

    你也可以通过合成来做到这一点:

    enter = map (\x -> if (x == 0) then 2 else x) . head
    

    您不再需要命名参数,而是使用.

    使用 do 表示法

    也许这对新手来说不是最好的点,但在do 符号中你可以写它 像这样:

    enter ground = head $ do
      lst <- ground
      return $ map (\x -> if (x == 0) then 2 else x) lst
    

    你在这里每个lst在参数ground中,然后使用你的map 转换它并将它们全部放入另一个列表return - 当然在这里你必须在之后做head才能获得第一个。

    当然这只是为了演示可能使用&lt;-的地方——不要这样写。

    【讨论】:

    • 是的,我认为您的第一个解释就是我想要做的。当然,我有一个接地功能。但是,所以当我这样做时,我收到以下错误:无法将类型“[Int]”与“Int”匹配预期类型:[Int] 实际类型:[[Int]] 就像我在我的问题中写的那样, ground 的返回类型为 [[Int]];这种情况该怎么办?
    • 如果你有另一个函数ground,那么你必须从中获取结果并将其放入输入:enter . ground $ yourArgumentForGroundHere - 如果没有看到你的地面,我无法让它更干净
    • 我已将此添加到答案中
    • enter [lst,_] = 只匹配两个元素。
    • @CarstenKönig (lst,_) 甚至不是一个列表:P。寻找(lst:_)