Эта ошибка чаще всего встречается при попытке ссылаться на значение массива с помощью ключевого слова для интерполяции внутри строки с двумя кавычками , когда вся конструкция комплексной переменной не заключена в {}
.
Это приведет к Unexpected T_ENCAPSED_AND_WHITESPACE
:
echo "This is a double-quoted string with a quoted array key in $array['key']";
//---------------------------------------------------------------------^^^^^
В строке с двойными кавычками PHP разрешает использовать строки ключей ключей без кавычек и не выдаст E_NOTICE
. Таким образом, вышесказанное может быть записано как:
echo "This is a double-quoted string with an un-quoted array key in $array[key]";
//------------------------------------------------------------------------^^^^^
Вся сложная переменная массива и ключ (ы) могут быть заключены в {}
, и в этом случае они должны быть указаны чтобы избежать E_NOTICE
. Документация PHP рекомендует этот синтаксис для сложных переменных.
echo "This is a double-quoted string with a quoted array key in {$array['key']}";
//--------------------------------------------------------------^^^^^^^^^^^^^^^
// Or a complex array property of an object:
echo "This is a a double-quoted string with a complex {$object->property->array['key']}";
Конечно, альтернатива любой из вышеперечисленного заключается в объединении переменной массива in вместо интерполировать его:
echo "This is a double-quoted string with an array variable " . $array['key'] . " concatenated inside.";
//----------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^
Для справки см. раздел «Переменная синтаксический анализ» в странице руководства PHP Strings
Вы задаете два различных вопроса: изучение и производительность.
map
, filter
, и fold
. Я сделал все это с ML, но он перевел в Haskell очень легко. Вы наблюдали проблему производительности только потому, что Вы адаптировали алгоритм, загруженный мутацией, которую Tony Hoare разработал для императивных языков, и попробованный для перевода в Haskell. В Haskell как на любом другом функциональном языке дорогая операция выделение . Попытайтесь писать сортировка слиянием , и Вы найдете, что это просто и работает очень хорошо.
, Как Вы стараетесь не делать подобные ошибки в будущем? Взгляните на книгу Chris Okasaki Чисто Функциональные Структуры данных . Замечательная книга, и это поможет Вам изучить 'функциональный способ сделать вещи', не бросая производительность.
Точка не должна писать быстрый код Haskell, но записать, что Haskell кодирует быстро. Когда Вы добираетесь там, и необходимо сделать код быстрым (er), начать оптимизировать (или используйте FFI, Вы не должны забывать свои навыки C++). В Haskell Вы ищете элегантность, надежность и пригодность для обслуживания сначала. Я добавил бы профилирование к своему Haskell-fu, таким образом, Вы не напрасно тратите время, оптимизируя то, что не используется. И не забудьте не оптимизировать преждевременно.
Существует очень определенная причина, почему quicksort не так быстр в Haskell. Это - подобный Богу пример алгоритма, которому соткали блестящее хакерство в то, как это работает - что я подразумеваю под хакерством, в этом случае вид методов, которые истинный приверженец Haskell расценил бы как излишне опасный и нематематический. Исходная реализация приложила все усилия для нарушения правлений, которые Haskell навязывает себе: подлинный quicksort работает путем перезаписи слотов устройства хранения данных с новой информацией. Это очень болезненно, чтобы сделать в Haskell, который находит намного легче сделать целые новые копии существующей информации.
Поэтому, хотя те наивные две строки версия Haskell получает что-то существенное quicksort (это делает то же количество ключевых сравнений), это не действительно quicksort. Это пропускает значительную часть гения, который вошел в него, который в полной мере воспользовался способностью настроить состояние существующих значений. Таким образом, это делает большие количества промежуточных копий частей списка.
Предположение: компилятор Haskell мог проанализировать Ваш код, применив то же обоснование как Hoare (изобретатель quicksort) и выяснить, что это могло оптимизировать его путем завершенной перереализации его способом с сохранением информации? Возможно.
Так, для ответа на вопрос в заголовке Вы будете, вероятно, чувствовать справедливо дома с основами Haskell в течение короткого времени. Особенно, если Вы уже знакомы с функциональным программированием. Вещи, которые действительно заставляют Haskell выделиться, такие как лень, вводят классы, семейства шрифтов, и конечно страшные монады (и стрелки), вероятно, потребуют, чтобы больше времени поняло и привыкло к. Существуют хорошие ресурсы для изучения языка, многие в свободном доступе, вместе с полезным сообществом, таким образом, я сказал бы, что Вы, вероятно, хорошо будете на пути к чувствованию себя комфортно в течение недели или двух из полусерьезного исследования;-)
я думаю, что это стоит того, хотя, точно так же, как некоторые люди утверждают, что стоит изучить Lisp, даже если Вы никогда не будете на самом деле использовать его ни для чего. Это стоит того, потому что это делает Вас лучшим программистом - это заставляет Вас думать по-другому. Я утверждал бы, что Haskell имеет подобный эффект.
Причина состоит в том, что математическая основа компьютеров отличается от математической основы Haskell и функциональных языков в целом.
Для получения вкуса проблемного компилятора стоит... Переведите программу Haskell в C, сохранив его максимально близко к оригиналу, затем попытайтесь оптимизировать это код C (не переписывая его с нуля C-способом)
, Это не является немым, но функциональные языки не сделаны для производительности, и краткая математически простая нотация не появляется бесплатно.