gpt4 book ai didi

list - Haskell类型的数学问题

转载 作者:行者123 更新时间:2023-12-05 08:24:27 25 4
gpt4 key购买 nike

我是 haskell 初学者。我尝试编写将返回倒数第二个列表元素的函数。

我这样开始:

lastButOne :: [a] -> a
lastButOne list = if null list
then
0
else
length list

0 字符串我得到错误:

Couldn't match type `a' with `Int'
`a' is a rigid type variable bound by
the type signature for lastButOne :: [a] -> a

我明白了。但是我能在这里做什么呢?我不知道列表类型。我可以在这里放什么?

谢谢。

最佳答案

0 是 int 类型,因此它不适用于所有 a。我建议改为使用 Maybe a ,如下所示:

lastButOne :: [a] -> Maybe a
lastButOne [] = Nothing
lastButOne [x] = Nothing
lastButOne xs = Just $ list !! (length xs - 2)

使用守卫:

lastButOne :: [a] -> Maybe a
lastButOne xs | length xs > 1 = Just $ list !! (length list - 2)
| otherwise = Nothing

使用 Maybe 的 MonadPlus 实例:

import Control.Monad (guard)

lastButOne :: [a] -> Maybe a
lastButOne list = guard (length list > 1) >> return (list !! (length list - 2))

一般来说,对于任何 MonadPlus 实例:

import Control.Monad (guard)

lastButOne :: MonadPlus m => [a] -> m a
lastButOne list = guard (length list > 1) >> return (list !! (length list - 2))

尽管在某处您必须向编译器指定您希望结果为 Maybe。通常这将是类型推断的,因为它将被传递给一个需要 Maybe 的函数。

请记住,这在 O(n) 中运行。您可能不想查找列表的倒数第二个元素……您为什么需要这样做?至少考虑改用数组。

关于list - Haskell类型的数学问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6397366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com