gpt4 book ai didi

haskell - 产生不同解释器结果的等效函数

转载 作者:行者123 更新时间:2023-12-02 21:28:50 24 4
gpt4 key购买 nike

背景:我正在研究匿名递归,并且我正在接受在不使用任何命名递归的情况下实现前奏的挑战,只是为了帮助这一切在我的脑海中得到很好的体现。我还没有完全做到这一点,一路上我遇到了一些不相关但仍然有趣的事情。

map1     = \f -> \x -> if (tail x) == [] 
then [f (head x)]
else f (head x) : (map1 f (tail x))

map2 f x = if (tail x) == []
then [f (head x)]
else f (head x) : (map2 f (tail x))

map3 f (x:xs) = if xs == [] then [f x] else f x : (map3 f xs)

map4 f (x:[]) = [f x]
map4 f (x:xs) = f x : map4 f xs

GHC 提示第一个,对第二个没问题,第三个和第四个只是为了展示它们如何以不同的方式实现。

*Main> map1 (*2) [1..10]

<interactive>:1:15:
No instance for (Num ())
arising from the literal `10'
Possible fix: add an instance declaration for (Num ())
In the expression: 10
In the second argument of `map1', namely `[1 .. 10]'
In the expression: map1 (* 2) [1 .. 10]
*Main> map2 (*2) [1..10]
[2,4,6,8,10,12,14,16,18,20]
*Main> map3 (*2) [1..10]
[2,4,6,8,10,12,14,16,18,20]
*Main> map4 (*2) [1..10]
[2,4,6,8,10,12,14,16,18,20]

如果我向 map1 添加类型签名,那就没问题了。

map1 :: Eq a => (a -> b) -> [a] -> [b]

前两个函数对我来说几乎相同,所以我想我的问题只是“这里发生了什么?”

最佳答案

你被monomorphism restriction咬了。任何写为 foo = ... 的内容- 意味着定义没有参数,并且没有给出显式类型 - 根据此限制必须具有非泛型类型。正如您所说,这种情况下的通用类型必须是 Eq a => (a -> b) -> [a] -> [b] ,但由于单态限制适用,ab() 取代,可以推断出可用类型变量的最简单类型。

关于haskell - 产生不同解释器结果的等效函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8888174/

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