我设法实现了模拟过滤器功能(经过多次尝试)
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?
答案 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
运算符而推断出<
类型类。