gpt4 book ai didi

haskell - 了解 Haskell 类型

转载 作者:行者123 更新时间:2023-12-04 06:08:01 24 4
gpt4 key购买 nike

我已经设法实现了一个模拟过滤器函数(经过多次尝试)

filter' :: (Num a, Eq a) => (a -> Bool) -> [a] -> [a]
filter' a [] = []
filter' a (x:xs) = if a x
then x : filter' a xs
else filter' a xs

没看明白的是类型声明

filter' :: (Num a, Eq a) => (a -> Bool) -> [a] -> [a]
-- filter' (<10) [1,2,3]
-- output = []

我们传入 (<10) [1,2,3] .但是在类型声明中 (a -> Bool)我们递归地传入来自列表的 a ,输出为 true 或 false。但是表达测试怎么样(<10)?我们为什么不添加另一个 Bool?

最佳答案

你的 filter' 的类型function 之所以如此受限,是因为您已经声明了它。如果您不声明类型,编译器将推断出更宽容的类型:(a -> Bool) -> [a] -> [a] .这与内置的类型相同 filter功能:

Prelude> :type filter
filter :: (a -> Bool) -> [a] -> [a]

表达式(< 10)是所谓的部分。这是一个部分应用的函数。

运营商<本身就是一个函数:

Prelude> :type (<)
(<) :: Ord a => a -> a -> Bool

您可以将其解读为:<是一个接受两个参数的函数,都是泛型类型 a .类型a必须属于类型类 Ord .当您调用 <有了这两个值,一个 Bool返回值。

因为 Haskell 函数是curried,你可以只用一些参数调用一个函数。返回值是一个“等待剩余参数”的新函数:

Prelude> :type (< 10)
(< 10) :: (Num a, Ord a) => a -> Bool

这个类型有点受限,因为字面量 10推断属于Num类型类。自 <正在使用中,原始约束 ( Ord ) 仍然有效。

表达式[1,2,3]是由编译器推断为:

Prelude> :type [1,2,3]
[1,2,3] :: Num t => [t]

所有值都属于Num类型类。当您一起使用所有这些类型时,您将获得所有推断类型的联合:

Prelude> :type filter (< 10) [1,2,3]
filter (< 10) [1,2,3] :: (Num a, Ord a) => [a]

Num类型类是由于使用文字而推断出来的,Ord类型类是由于使用了 < 而推断出来的运营商。

关于haskell - 了解 Haskell 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35505887/

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