gpt4 book ai didi

list - Haskell 错误 - (Num a) 没有由文字 ‘1’ 引起的实例

转载 作者:行者123 更新时间:2023-12-01 22:07:07 25 4
gpt4 key购买 nike

我正在尝试创建一个函数,它在给定列表中的每个条目之前添加一个 1。我还没有完全掌握 Haskell 的语法,想知道这段代码有什么问题。例如,我希望返回列表 [1,1,1,2,1,3]

ins1 :: [a] -> [a]
ins1 [x] = [x]
ins1 (x:xs) = [1] ++ [x] ++ ins1(xs)

main = print(ins1 [1,2,3])

我得到错误:

• No instance for (Num a) arising from the literal ‘1’
Possible fix:
add (Num a) to the context of
the type signature for:
ins1 :: [a] -> [a]
• In the expression: 1
In the first argument of ‘(++)’, namely ‘[1]’
In the expression: [1] ++ [x] ++ ins1 (xs)
<interactive>:3:1: error:
• Variable not in scope: main
• Perhaps you meant ‘min’ (imported from Prelude)

最佳答案

正如错误所说,您使用 ins1,并且您编写了 [1]++ [x]++ ...

现在 1 是一个数字文字,所以它可以接受所有数字类型。因此 1 的类型为 Num b => b,因此 [1] 的类型为 Num b => [b].

稍后您在列表中附加 x 和递归,因此我们现在知道 a ~ b(ab 是同一类型)。所以我们必须为 a 的签名添加一个类型约束:

ins1 :: <b>Num a =></b> [a] -> [a]
ins1 [x] = [x]
ins1 (x:xs) = [1] ++ [x] ++ ins1(xs)

这解决了编译错误,但可能不会生成您想要的。因为现在没有空列表的情况。没有。事实上,[x] 模式和 (x:xs) 模式都适用于分别与具有恰好一个元素的列表相匹配的列表,和至少一个元素。

因此我认为您的第一个子句实际上应该匹配空列表:

ins1 :: Num a => [a] -> [a]
<b>ins1 [] = []</b>
ins1 (x:xs) = [1] ++ [x] ++ ins1(xs)

第二个子句也有一个低效的地方:你追加到一个只有一个元素的列表,所以我们可以在这里使用“cons”数据构造函数(:) :

ins1 :: Num a => [a] -> [a]
ins1 [] = []
ins1 (x:xs) = <b>1 : x : ins1 xs</b>

这将为原始列表中的每个 元素插入一个1,因此:

Prelude> ins1 [1, 4, 2, 5]
[1,1,1,4,1,2,1,5]

关于list - Haskell 错误 - (Num a) 没有由文字 ‘1’ 引起的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50895597/

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