Сколько времени занимает, чтобы Вы были довольны Haskell?

Ошибка синтаксиса: ошибка синтаксиса, неожиданный T_ENCAPSED_AND_WHITESPACE

Эта ошибка чаще всего встречается при попытке ссылаться на значение массива с помощью ключевого слова для интерполяции внутри строки с двумя кавычками , когда вся конструкция комплексной переменной не заключена в {}.

Случай ошибки:

Это приведет к 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

30
задан asymmetric 24 September 2012 в 09:21
поделиться

5 ответов

Вы задаете два различных вопроса: изучение и производительность.

  • мне потребовался приблизительно месяц для становления довольным функциональным программированием с помощью рекурсии, сопоставления с образцом, map, filter, и fold. Я сделал все это с ML, но он перевел в Haskell очень легко.
  • мне потребовались два или три года для обертывания моей головы вокруг монад, но поэтому я считал неправильный материал. Я думаю, что теперь существуют лучшие учебные руководства. Но если Вы начинаете, избегаете монад некоторое время.
  • мне потребовались несколько месяцев для получения хорошим при создании новых классов типа, но использование существующих было легко.
  • я все еще не уверен, что у меня есть подвешивание [1 113] отложенные вычисления . Но я люблю Haskell чистота и склонен рассматривать отложенные вычисления как несчастный несчастный случай, который знают только несколько человек (как John Hughes), как использовать.

Вы наблюдали проблему производительности только потому, что Вы адаптировали алгоритм, загруженный мутацией, которую Tony Hoare разработал для императивных языков, и попробованный для перевода в Haskell. В Haskell как на любом другом функциональном языке дорогая операция выделение . Попытайтесь писать сортировка слиянием , и Вы найдете, что это просто и работает очень хорошо.

, Как Вы стараетесь не делать подобные ошибки в будущем? Взгляните на книгу Chris Okasaki Чисто Функциональные Структуры данных . Замечательная книга, и это поможет Вам изучить 'функциональный способ сделать вещи', не бросая производительность.

60
ответ дан Norman Ramsey 27 November 2019 в 23:03
поделиться

Точка не должна писать быстрый код Haskell, но записать, что Haskell кодирует быстро. Когда Вы добираетесь там, и необходимо сделать код быстрым (er), начать оптимизировать (или используйте FFI, Вы не должны забывать свои навыки C++). В Haskell Вы ищете элегантность, надежность и пригодность для обслуживания сначала. Я добавил бы профилирование к своему Haskell-fu, таким образом, Вы не напрасно тратите время, оптимизируя то, что не используется. И не забудьте не оптимизировать преждевременно.

13
ответ дан TheMarko 27 November 2019 в 23:03
поделиться

Существует очень определенная причина, почему quicksort не так быстр в Haskell. Это - подобный Богу пример алгоритма, которому соткали блестящее хакерство в то, как это работает - что я подразумеваю под хакерством, в этом случае вид методов, которые истинный приверженец Haskell расценил бы как излишне опасный и нематематический. Исходная реализация приложила все усилия для нарушения правлений, которые Haskell навязывает себе: подлинный quicksort работает путем перезаписи слотов устройства хранения данных с новой информацией. Это очень болезненно, чтобы сделать в Haskell, который находит намного легче сделать целые новые копии существующей информации.

Поэтому, хотя те наивные две строки версия Haskell получает что-то существенное quicksort (это делает то же количество ключевых сравнений), это не действительно quicksort. Это пропускает значительную часть гения, который вошел в него, который в полной мере воспользовался способностью настроить состояние существующих значений. Таким образом, это делает большие количества промежуточных копий частей списка.

Предположение: компилятор Haskell мог проанализировать Ваш код, применив то же обоснование как Hoare (изобретатель quicksort) и выяснить, что это могло оптимизировать его путем завершенной перереализации его способом с сохранением информации? Возможно.

21
ответ дан Daniel Earwicker 27 November 2019 в 23:03
поделиться

Так, для ответа на вопрос в заголовке Вы будете, вероятно, чувствовать справедливо дома с основами Haskell в течение короткого времени. Особенно, если Вы уже знакомы с функциональным программированием. Вещи, которые действительно заставляют Haskell выделиться, такие как лень, вводят классы, семейства шрифтов, и конечно страшные монады (и стрелки), вероятно, потребуют, чтобы больше времени поняло и привыкло к. Существуют хорошие ресурсы для изучения языка, многие в свободном доступе, вместе с полезным сообществом, таким образом, я сказал бы, что Вы, вероятно, хорошо будете на пути к чувствованию себя комфортно в течение недели или двух из полусерьезного исследования;-)

я думаю, что это стоит того, хотя, точно так же, как некоторые люди утверждают, что стоит изучить Lisp, даже если Вы никогда не будете на самом деле использовать его ни для чего. Это стоит того, потому что это делает Вас лучшим программистом - это заставляет Вас думать по-другому. Я утверждал бы, что Haskell имеет подобный эффект.

8
ответ дан Magnus 27 November 2019 в 23:03
поделиться

Причина состоит в том, что математическая основа компьютеров отличается от математической основы Haskell и функциональных языков в целом.

Для получения вкуса проблемного компилятора стоит... Переведите программу Haskell в C, сохранив его максимально близко к оригиналу, затем попытайтесь оптимизировать это код C (не переписывая его с нуля C-способом)

, Это не является немым, но функциональные языки не сделаны для производительности, и краткая математически простая нотация не появляется бесплатно.

4
ответ дан ima 27 November 2019 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: