Что происходит под капотом, когда мы определяем псевдоним типа с переменной типа в Elm

В onCreateView(), getView() возвращает null, поскольку вы еще не вернули представление в фреймворк.

Вызов findViewById() на View v, который вы только что надули вместо этого.

1
задан 4 March 2019 в 13:41
поделиться

2 ответа

Тип Message () является псевдонимом для следующей записи:

{ code : String
, body : ()
}

, где тип () обозначает кортеж без элементов (также известный как нулевой кортеж ) , Существует только одно значение такого типа, и оно также записано ().

Теперь, когда мы хотим опустить какое-либо поле в записи, мы не можем просто не указать его - это может привести к полному безумию компилятора, см. Также Ошибка в миллиардном долларе . Нам нужно сообщить компилятору, что значение может быть опущено.

Один из способов сделать это - использовать тип Maybe , но если бы мы составили список сообщений, который позволил бы нам включать тело в некоторые сообщения и опускать его в других. Это может быть не то, что мы хотим.

Альтернативой является параметризация типа Message, как вы делаете в вопросе. Это позволит нам иметь сообщения с String телами при чтении сообщения и с другим типом телосложения, когда мы не заинтересованы в теле.

В этом случае нам нужно подумать, каким должен быть тип телосложения. Хотя мы могли бы использовать пустые String для сообщений с пропущенными телами, их было бы легко спутать с сообщениями с пустыми телами. Мы также могли бы использовать Bool, но тогда нам нужно было бы решить, хотим ли мы использовать True или False для пропущенного значения. Наконец, мы можем использовать пустой кортеж ; поскольку оно имеет только одно возможное значение, оно идеально для нас.

На самом деле есть еще одна возможность: мы могли бы создать type alias MessageWithoutBody = { code: String }. В некоторых случаях это чище (особенно если вам нужно пропустить больше полей), но может быть более подробным, поскольку вам нужно дублировать все поля, которые вы хотите сохранить.

0
ответ дан Jan Tojnar 4 March 2019 в 13:41
поделиться

Если вы действительно не хотите видеть внутреннее представление компилятора, я думаю, что здесь важно различие между any value и empty value.

Message a является параметризованным типом с 1 параметром. Вы можете прочитать его как шаблон, например, везде, где строчная буква a появляется в определении Message, она будет заменена конкретным типом (String, Int и т. д.).

Так вот как должна выглядеть функция, если мы хотим, чтобы она взяла Message с телом String:

readMessage : Message String -> String
readMessage message =

Здесь происходит то, что тип поля body не длиннее a, но String (a заменяется на String):

{ code : String
, body : String
}

Значение Ничего (иначе void или unit) в Elm кодируется как (). Вот почему Message с пустым значением тела выглядит так:

{ code : String
, body : ()
}

Но когда нам просто не важно значение тела, мы можем просто взять Message со значением any: [ 1129]

readMessage : Message a -> String
readMessage message =

Строчной буквой a может быть любая строчная строчная буква, мы можем сделать ее более читабельной, например:

readMessage : Message any -> String
readMessage message =

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

Надеюсь, это поможет.

0
ответ дан Karol Samborski 4 March 2019 в 13:41
поделиться