2013-06-18 3 views
1

Learn You A Haskell На, я прочитал:Есть ли у PHP переменная типа Haskell?

first :: (a, b, c) -> a 
first (x, _, _) = x 
second :: (a, b, c) -> b 
second (_, y, _) = y 
third :: (a, b, c) -> c 
third (_, _, z) = z 

The _ означает то же самое, что он делает в списковых. Это означает, что нам действительно все равно, что это за часть, поэтому мы просто напишем _.

Есть ли что-то подобное в PHP? Если да, для чего его можно использовать? Если нет, то почему разработчики решили не реализовывать его?

+0

Покажите свой пример, когда вы хотите использовать его. И показать возможность синтаксиса. – sectus

+0

@sectus Мне просто интересно - не знаю, было бы полезно, это чисто гипотетически. Возможным синтаксисом может быть '$ _' или' $ ', но это основано только на моем воображении. – Keelan

ответ

1

Нет, в PHP нет ничего подобного. И ничего подобного не было, поскольку функциональные возможности PHP теперь (с появлением PHP 5.5) только начинают расти из детства. Пока вы не видите функции, которые принимают обратные вызовы, и, кроме того, синтаксис лямбды несколько подробный, поэтому функция, которая позволяет вам более удобно объявлять lambdas, не очень высока на лестнице полезности.

В Haskell _ является сокращенным способом сказать «есть параметр здесь, но я не забочусь об этом», и каждом виде _ считается быть отличается параметром друг от друга внешнего вида.

причуда PHP, что позволяет моделировать этот синтаксис является тот факт, что функция может иметь несколько параметров с таким же именем:

// compiles with no problem! 
function foo($param, $param, $param) { 
    echo $param; 
} 

foo(1, 2, 3); // prints 3 

Отсюда следует, что вы можете это сделать, если вы хотите игнорировать первые два параметра функции:

function foo($_, $_, $param) {} 

Однако это не означает, что ничего особенного в компиляторе и не отличается от использования различных имен для параметров. Это не идиоматический PHP и, скорее всего, путают читателей этого кода. Поэтому, пока вы можете это сделать, ИМХО, это не очень хорошая идея.

Как в стороне, есть одно место на PHP, где вам разрешено определенно заявить, что вам не нужны фрагменты информации: конструкция list.

$a = array(1, 2); 
list($x, $y) = $a; // assigns $x = 1 and $y = 2 

Вы можете пропустить столько аргументов, сколько вы хотите в list, например:

list(, $y) = $a; // assigns $y = 2, the first element is ignored 
0

Вы имеете в виду необязательный аргумент в функции? Вы можете достичь этого, как это:

function add($x = 1, $y = 1) { 
    return $x + $y; 
} 

add(4,5); //9 
add(3); //4 

Примечание: вы не можете предоставить только второй аргумент, а не первый, что-то вроде этого

add(_,4) //error! 

не существует.

Смежные вопросы