【问题标题】:How can I find the middle element of the list in a function in haskell?如何在haskell的函数中找到列表的中间元素?
【发布时间】:2021-05-02 12:30:15
【问题描述】:

我需要一些有关 Haskell 的帮助。我是haskell的新手。我想找到列表的中间元素,但我想在函数中执行此操作。我试图找到列表的长度和除以 2。但我未能在函数中将列表的长度作为 int 获取。

findListL k = [z | let z = length k]

我尝试了顶部的代码,但失败了。 谁能告诉我怎么做?

【问题讨论】:

  • 如果列表有偶数个元素怎么办,比如[1,2,3,4]
  • 相反,您成功地将列表的长度作为函数中的 int 获取。好工作!只是获得它只是目标的一部分。你能用语言说出你想要做的事情吗?一旦您制定了计划,我们或许能够帮助您确定实现具体目标的现有功能(或编写您自己的功能)。 (顺便说一句,对于您提出的直接问题“有人可以告诉我该怎么做吗?”的答案是:“不,我们不会为您完成您的工作。”。)
  • 我的目标是将列表的长度作为 int,而不是作为列表。我在我的问题中提到了这一点。我说如果你读了我的问题,我找不到列表的长度,如果我找到了,我会把它除以 2 并得到我的结果。我在传入的解决方案中学到了一种不同的方法,这对我来说是一种新的学习。
  • @fs45:您是否尝试只写length k 而不是将其包装在列表中? findListL k = [z | let z = length k]findListL k = [length k] 相同,如果您不希望将结果包装在列表中,则可以省略该列表,改写为 findListL k = length k。要将这个长度分成两半,您可能需要length k `div` 2,用于向下舍入的整数除法,或fromIntegral (length k) / 2 用于小数除法,其中fromIntegralInt 转换为小数类型,例如Float 或@ 987654332@。 Int 没有小数除法 (/)

标签: list haskell


【解决方案1】:

我们可以用龟兔赛跑的方法来解决这个问题。我们在同一个列表上同时使用两个迭代器进行迭代。兔子每次走两步,而乌龟则向前走一步。如果野兔走到尽头,那么乌龟就在中间。因此,我们可以将其实现为:

findListL :: [a] -> a
findListL zs = go zs zs
  where go (_:_:xs) ~(_:ys) = go xs ys
        go _ (y:_) = y

这会产生:

Prelude> findListL []
*** Exception: <interactive>:(3,9)-(4,22): Non-exhaustive patterns in function go
Prelude> findListL [1]
1
Prelude> findListL [1,2]
2
Prelude> findListL [1,2,3]
2
Prelude> findListL [1,2,3,4]
3

对于一个空列表,这将引发错误,对于一个偶数长度的列表,它将采用索引 (n+1)/2 处的元素。

由于空列表的计算不起作用,因此通常构造一个函数,该函数返回一个Maybe a,因此如果我们在中间找到一个元素y,则返回一个Just y,然后返回一个Nothing如果列表为空。我把它留作练习。

【讨论】:

  • 从这个角度我没想到。我试图通过长度计算来做到这一点。感谢您的答复。这是我想要达到的结果,但我做不到。
猜你喜欢
  • 2017-07-20
  • 2015-12-24
  • 2015-02-07
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 2020-05-21
相关资源
最近更新 更多