Вы должны попытаться открыть свой 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.
Нестандартные и стандартные данные
Для поддержки параметрического полиморфизма и лени, по умолчанию типы данных Haskell представляются единообразно в виде указателя на закрытие на куче, со структурой, подобной этой:
(источник: haskell.org)
Это "стандартные" значения. Объект unboxed представлен непосредственно самим значением, без каких-либо косвенных указаний или замыканий. Int
является boxed, а Int#
- unboxed.
Ленивые значения требуют коробчатого представления. Строгие значения не требуют: они могут быть представлены либо как полностью вычисленные закрытия на куче, либо как примитивные структуры без коробки. Обратите внимание, что тегирование указателей - это оптимизация, которую мы можем использовать для коробочных объектов, чтобы закодировать конструктор в указателе на закрытие.
Взаимосвязь со строгостью
Обычно значения без коробок генерируются компиляторами функциональных языков в произвольном порядке. Однако в языке Haskell некоробчатые значения являются особенными. Они:
#
;Поскольку они являются несмещенными, они обязательно строгие. Представление лени невозможно.
Таким образом, конкретные невложенные типы, такие как 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++).
Аргументы любых типов могут быть сделаны «строгими», но единственными распакованными типами, которые имеют соответствующие типы в штучной упаковке, являются Char#
, Int#
, Word#
, Double#
и Float#
.
Если вы знаете языки низкого уровня, такие как C, это легче объяснить. Распакованные типы похожи на int
, double
и т. Д., А упакованные типы - на int*
, double*
и т. Д. Получив int
, вы уже знаете все значение в том виде, как оно представлено. в битовой структуре, следовательно, это не ленивый. Он также должен быть строгим, поскольку все значения int
являются действительными, а не & perp;.
Однако, учитывая int*
, вы можете выбрать разыменование указателя позже, чтобы получить фактическое значение (таким образом, ленивое), и возможно иметь недопустимые указатели (они содержат & perp; т.е. не строгие).
Распакованные типы обязательно являются строгими, но не все строгие значения обязательно распаковываются.
data Foo a = Foo !a !a
имеет два строгих поля
data Bar a = Bar {-# UNPACK #-} !Int !a
имеет два строгих поля, но первое не распаковано.
В конечном счете, причина того, что неупакованные типы (обязательно) являются строгими, заключается в том, что нет места для хранения преобразователя, поскольку в этот момент они представляют собой просто плоские, немые данные.