gpt4 book ai didi

haskell - 在haskell中的函数定义中声明函数类型

转载 作者:行者123 更新时间:2023-12-05 04:13:33 25 4
gpt4 key购买 nike

最近才开始学haskell。我对函数定义中的声明函数类型有些困惑。例如,如果我们要定义一个 foldr 函数:

foldr :: (a->b->b)->b->[a]->b
foldr f v [] = v
foldr f v (x:xs) = f x (foldr f v xs)

因此,foldr (+) 0 [1,2,3,4] = sum [1,2,3,4] = 10。

我的问题是:我可以把它改成类似这样的东西吗:

foldr :: (a->a->a)->a->[a]->a
OR:
foldr :: (a->b->c)->x->[y]->z

在定义中没有找到解释字母选择/要求的地方。谢谢!


更新:我测试了它:

 foldr :: (a->b->c)->x->[y]->z

出现以下错误:

   Couldn't match type `y' with `a'
`y' is a rigid type variable bound by
the type signature for folderr :: (a -> b -> c) -> x -> [y] -> z
at test.hs:3:1
`a' is a rigid type variable bound by
the type signature for folderr :: (a -> b -> c) -> x -> [y] -> z
at test.hs:3:1

如果将所有内容更改为 a,它就可以工作。我一定在这里遗漏了一些要点。


如@sepp2k 的评论中所述。我使用以下简单示例进行了测试:

     folderr :: (a->b->b)->b->[a]->b
folderr f v [] = v
folderr f v (x:xs) = f x (folderr f v xs)


myop :: Int -> Bool -> Bool
myop x y | x > 0 = True && y
| otherwise = False && y

folderr (myop) True [3,3,222] -> Truefolderr (myop) 真 [3,2,-1] -> 假

所以a,b只是表示类型不同。

最佳答案

类型变量的具体名称并不重要,即类型 a -> b -> cx -> y -> zfoo -> bar -> baz 完全等价。

重要的是您是多次使用相同类型的变量还是使用不同的变量。即 a -> ba -> a 是不同的类型。具体来说,a -> b 更通用,因为在具体类型中,Int -> IntString -> StringInt -> StringString -> Inta -> a 只会匹配前两个(a = Inta = String 分别)而 a -> b 将匹配所有四个。

关于haskell - 在haskell中的函数定义中声明函数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37148264/

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