理解Haskell类型

时间:2016-02-19 12:55:50

标签: haskell

我设法实现了模拟过滤器功能(经过多次尝试)

Fatal error: Uncaught exception 'Stripe\Error\InvalidRequest' with message 
    'Amount must be at least 50 cents' in /stripe-php/lib/ApiRequestor.php:102 
     from API request 'req_7w4X4j80cfWZoS'
Stack trace:
#0 /lib/ApiRequestor.php(216): 
       Stripe\ApiRequestor->handleApiError('{\n "error": {\n...', 400, Array, Array)
#1 /stripe-php/lib/ApiRequestor.php(60): 
       Stripe\ApiRequestor->_interpretResponse('{\n "error": {\n...', 400, Array)
#2 /stripe-php/lib/ApiResource.php(105): 
        Stripe\ApiRequestor->request('post', '/v1/charges', Array, Array)
#3 stripe-php/lib/ApiResource.php(137): 
         Stripe\ApiResource::_staticRequest('post', '/v1/charges', Array, NULL)
#4 /home/imarkinfo/donogifts.com/stripe-php/lib/Charge.php(37):
          Stripe\ApiResource::_create(Array, NULL)
#5 /form_section.php(81): 
          Stripe\Charge::create(Array)
#6 {main} thrown in stripe-php/lib/ApiRequestor.php on line 102

我不清楚的是类型声明

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]中,我们传递一个来自列表的递归,输出为true或false。然而,表达测试怎么样(a -> Bool)为什么我们不添加另一个Bool?

1 个答案:

答案 0 :(得分:8)

filter'函数的类型只受限制,因为您已声明它是。如果您没有声明类型,编译器将推断出更宽容的类型:(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运算符而推断出<类型类。