哈斯克尔咖喱地图

时间:2018-07-30 17:32:42

标签: haskell functional-programming

因此我了解您可以:

> f = map (+1)
> f [1,2,3]
[2,3,4]

但是,如果您这样做:

> g = map (+) [1,2,3]
> :t g
g :: Num a => [a -> a]

我不确定如何使用g。它的输入和输出是什么?

2 个答案:

答案 0 :(得分:8)

例如,可以将列表的每个元素应用于特定值:

function readToppingsList(
  SimpleXMLElement $itemElement, 
  string $listName, 
  string $itemName = 'topping'
): array {
  $toppings = [];
  if ($itemElement->{$listName}) {
    foreach ($itemElement->{$listName}->{$itemName} as $toppingElement) {
      $toppings[] = (string)$toppingElement;
    }
  }
  return $toppings;
}

$itemsElement = new SimpleXMLElement($xml);

$items = [];
foreach ($itemsElement->item as $itemElement) {
  $item = [
    'product_id' => (string)$itemElement->product_id,
    'whole_toppings' => readToppingsList($itemElement, 'whole_toppings'),
    'left_toppings' => readToppingsList($itemElement, 'left_toppings')
  ];
  $items[] = $item;
}

echo json_encode($items, JSON_PRETTY_PRINT);

或者您可以将列表中的每个函数应用于另一个列表的相应位置中的值:

> map (\f -> f 3) g
[4,5,6]

或者您可以在列表上进行模式匹配,或者在列表理解中使用它,或者用> zipWith (\f x -> f x) g [30,300,3000] [31,302,3003] 对其进行索引,或者,或者,或者,或者...存在无限的可能性。

答案 1 :(得分:2)

(+) :: Num a => a -> a -> a;它需要一个数字并返回一个增加其参数的函数。

map (+) [1, 2, 3]相当于[(+ 1), (+ 2), (+ 3)]。使用此类函数列表的一种方法是与Applicative的{​​{1}}实例一起使用,它允许您将列表中的每个函数应用于另一个列表中的每个值。例如:

[]