gpt4 book ai didi

Haskell 平面图

转载 作者:行者123 更新时间:2023-12-04 00:36:53 25 4
gpt4 key购买 nike

我是一个对 Haskell 感兴趣的初学者,我一直在尝试自己实现 flatmap (>>=) 以更好地理解它。目前我有

flatmap :: (t -> a) -> [t] -> [a]  
flatmap _ [] = []
flatmap f (x:xs) = f x : flatmap f xs

它实现了“ map ”部分,但没有实现“平面”。
我所做的大多数修改都导致令人沮丧且相当无信息
Occurs check: cannot construct the infinite type: a = [a]  
When generalising the type(s) for `flatmap'

错误。

我错过了什么?

最佳答案

当您指定的类型签名与函数的实际类型不匹配时,就会发生这样的错误。由于您没有显示导致错误的代码,我不得不猜测,但我认为您将其更改为如下所示:

flatmap _ [] = []  
flatmap f (x:xs) = f x ++ flatmap f xs

碰巧的是,这是完全正确的。但是,如果您忘记更改类型签名,则会发生以下情况:

类型检查器看到您在 f x 的结果上使用了++和 flatmap f xs .由于 ++在两个相同类型的列表上工作,类型检查器现在知道两个表达式都必须计算为相同类型的列表。现在类型检查器也知道 flatmap f xs将返回 [a] 类型的结果, 所以 f x还必须有类型 [a] .但是在类型签名中它说 f 具有类型 t -> a , 所以 f x必须有类型 a .这导致类型检查器得出结论 [a] = a这是一个矛盾并导致您看到的错误消息。

如果将类型签名更改为 flatmap :: (t -> [a]) -> [t] -> [a] (或删除它),它会工作。

关于Haskell 平面图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2986787/

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