Каковы отношения между распакованными типами и строгостью?

Вы должны попытаться открыть свой docURL в браузере своего планшета, предпочтительно Chrome.

Ваш код работал для меня в этом документе на Samsung Galaxy J7 Pro, Android 8.1 и Moto G4, Android 7.0. Оба физических устройства. И это не показывало URL.

Он также работал на имитированном Android Nexus 5 API 23, то есть Android 6.0.

Единственное разрешение, которое вам нужно, это:

Убедитесь, что на ваших планшетах обновлено Android WebView .

Это также может быть проблема с настройкой DNS, содержанием вашего документа или доменом для вашего документа. Я создал ссылку для своего теста, перейдя в File -> Share -> Insert Into Blog или Site, и взял контент для атрибута src для сгенерированного iframe.

29
задан hammar 30 September 2011 в 19:19
поделиться

3 ответа

Нестандартные и стандартные данные

Для поддержки параметрического полиморфизма и лени, по умолчанию типы данных Haskell представляются единообразно в виде указателя на закрытие на куче, со структурой, подобной этой:

alt text
(источник: haskell.org)

Это "стандартные" значения. Объект unboxed представлен непосредственно самим значением, без каких-либо косвенных указаний или замыканий. Int является boxed, а Int# - unboxed.

Ленивые значения требуют коробчатого представления. Строгие значения не требуют: они могут быть представлены либо как полностью вычисленные закрытия на куче, либо как примитивные структуры без коробки. Обратите внимание, что тегирование указателей - это оптимизация, которую мы можем использовать для коробочных объектов, чтобы закодировать конструктор в указателе на закрытие.

Взаимосвязь со строгостью

Обычно значения без коробок генерируются компиляторами функциональных языков в произвольном порядке. Однако в языке Haskell некоробчатые значения являются особенными. Они:

  1. имеют другой вид, #;
  2. могут использоваться только в специальных местах; и
  3. они не подняты, поэтому не представлены как указатель на значение кучи.

Поскольку они являются несмещенными, они обязательно строгие. Представление лени невозможно.

Таким образом, конкретные невложенные типы, такие как Int#, Double#, на машине (в нотации C) действительно представляются просто как double или int.

Анализ строгости

Отдельно GHC делает анализ строгости обычных типов Haskell. Если обнаруживается, что использование значения является строгим - т.е. оно никогда не может быть "неопределенным" - оптимизатор может заменить все использования регулярного типа (например, Int) на нефиксированный (Int#), поскольку он знает, что использование Int всегда строго, и поэтому замена на более эффективный (и всегда строгий) тип Int# безопасна.

Мы, конечно, можем иметь строгие типы без нестрогих типов, например, полиморфный список element-strict:

data List a = Empty | Cons !a (List a)

строг в своих элементах, но не представляет их как нестрогие значения.

Это также указывает на ошибку, которую вы допустили в отношении строгих языков, таких как OCaml. Они все еще должны поддерживать полиморфизм, поэтому либо они обеспечивают единообразное представление, либо специализируют типы данных и функции для каждого типа. GHC по умолчанию использует единое представление, как и OCaml, хотя GHC также может специализировать типы и функции (как шаблоны C++).

35
ответ дан 28 November 2019 в 01:22
поделиться

Аргументы любых типов могут быть сделаны «строгими», но единственными распакованными типами, которые имеют соответствующие типы в штучной упаковке, являются Char#, Int#, Word#, Double# и Float#.

Если вы знаете языки низкого уровня, такие как C, это легче объяснить. Распакованные типы похожи на int, double и т. Д., А упакованные типы - на int*, double* и т. Д. Получив int, вы уже знаете все значение в том виде, как оно представлено. в битовой структуре, следовательно, это не ленивый. Он также должен быть строгим, поскольку все значения int являются действительными, а не & perp;.

Однако, учитывая int*, вы можете выбрать разыменование указателя позже, чтобы получить фактическое значение (таким образом, ленивое), и возможно иметь недопустимые указатели (они содержат & perp; т.е. не строгие).

8
ответ дан kennytm 28 November 2019 в 01:22
поделиться

Распакованные типы обязательно являются строгими, но не все строгие значения обязательно распаковываются.

data Foo a = Foo !a !a

имеет два строгих поля

data Bar a = Bar {-# UNPACK #-} !Int !a

имеет два строгих поля, но первое не распаковано.

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

16
ответ дан 28 November 2019 в 01:22
поделиться
Другие вопросы по тегам:

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