Haskell - 没有"!!"得到第n个元素

use*_*051 8 haskell

嗨,我需要获取列表的第n个元素,但不使用!! 运营商.我对haskell非常陌生,所以如果您能够更详细地回答而不仅仅是一行代码,我将不胜感激.这就是我现在正在尝试的:

nthel:: Int -> [Int] -> Int
nthel n xs = 0
let xsxs = take n xs
nthel n xs = last xsxs
Run Code Online (Sandbox Code Playgroud)

但我得到:解析错误(可能是不正确的缩进)

先感谢您!

Dan*_*zer 12

这里有很多东西,

nthel :: Int -> [Int] -> Int
Run Code Online (Sandbox Code Playgroud)

在技​​术上是正确的,我们真的想要

nthel :: Int -> [a] -> a
Run Code Online (Sandbox Code Playgroud)

所以我们可以在任何列表中使用它(可选)

nthel n xs = 0
Run Code Online (Sandbox Code Playgroud)

你刚刚说的是"无论你给什么nthel回报0".这显然是错的.

let xsxs = ...
Run Code Online (Sandbox Code Playgroud)

这不是合法的哈克尔.let ... in ...是一个表达式,它不能用于顶级.

从那里我不确定应该做什么.

也许这会帮助你走上正轨

nthelem n [] = <???> -- error case, empty list
nthelem 0 xs = head xs
nthelem n xs = <???> -- recursive case
Run Code Online (Sandbox Code Playgroud)

尝试<???>用你最好的猜测填写,我很乐意从那里帮助.

或者,您可以使用Haskell的"模式匹配"语法.我在这里解释如何使用列表完成此操作.

这改变了我们的上述

nthelem n [] = <???> -- error case, empty list
nthelem 0 (x:xs) = x --bind x to the first element, xs to the rest of the list
nthelem n (x:xs) = <???> -- recursive case
Run Code Online (Sandbox Code Playgroud)

这样做很方便,因为它无需使用explicit headtails.

  • @PhilipJF他开始使用haskell"几个小时前"我不会教他一些他无法理解的东西.他甚至不理解函数的语法,你想让我使用模式匹配吗?此外,它使空白完全无足轻重 (2认同)

Gab*_*lez 8

我想你的意思是:

nthel n xs = last xsxs
  where xsxs = take n xs
Run Code Online (Sandbox Code Playgroud)

...你可以简化为:

nthel n xs = last (take n xs)
Run Code Online (Sandbox Code Playgroud)

  • @ user43051我希望自己可以投票!:) 别客气. (3认同)