
Vladimir
03.04.2018
04:58:04
И в определении списка тоже путаница. Может интервьюер считал, что списки без [1,2..] -- не списки.

Theta
03.04.2018
04:58:25
нет, такого в контексте не было...
Таке он сказал что и строки соответственно строгими не могут быть... по-моему O_o
так как строки основанны на списках

Google

Theta
03.04.2018
04:59:26
(впрочем не на списках же тоже можно сделать, лол)
(блин, вот что значит хреново спать перед собеседованием...)

Dmitry
03.04.2018
05:00:27
Хм, а какое определение строгих типов? Что-то ненагугливается. Имеется ввиду строгая типизация? Ну так в Хаскеле она строгая.

Theta
03.04.2018
05:01:17
Ну вот же например
https://hackage.haskell.org/package/strict-types
два слова стрикт и тайпс
А не, не много не то

Index
03.04.2018
05:01:46

Theta
03.04.2018
05:01:49
Но реализацию строгого списка я скинул

Index
03.04.2018
05:03:39
В общем бесконечный список в стиле tie the knot можно и строгий сделать, а вот корекурсивный вроде [1, 2, ..] нельзя, наверное интервьер думал про второй тип списков

Theta
03.04.2018
05:03:59
нет, он именно про принципиальную вохможность определения
data List a = Nil | !a :! !(List a)
вот
и типа это невозможно
грил

Google

Index
03.04.2018
05:04:27
Ну это возможно конечно

Theta
03.04.2018
05:04:36
пример взят из библиотеки по ссылке

Index
03.04.2018
05:05:26
Чего б этому быть невозможным, bang-и просто приводят к расстановке seq при паттерн-матчинге

Oleg
03.04.2018
05:05:50
Примеры бесконечных
https://wiki.haskell.org/Memoization#Efficient_tree_data_structure_for_maps_from_Int_to_somewhere
https://hackage.haskell.org/package/Stream-0.4.7.2/docs/Data-Stream.html
Возможно, собеседователь имел в виду второй пример

Theta
03.04.2018
05:07:09
и мы не про примеры говорили
с ним
только конечные значения только хардкор

Index
03.04.2018
05:08:23

Theta
03.04.2018
05:08:37
вот вот

Index
03.04.2018
05:08:38
Но очевидно не с хвостом списка
Т.к. он рекурсивный

Theta
03.04.2018
05:09:09
Что? Конечный определённый хвост разве не строг?

Index
03.04.2018
05:09:24
Он строг, но не unpacked

Oleg
03.04.2018
05:09:33
и мы не про примеры говорили
я имел в виду пример АДТ, который не может быть определён через конструкторы, требующий whnf от каждого аргумента

Theta
03.04.2018
05:09:36
А, ну про распаковку не говорили

Google

Theta
03.04.2018
05:10:54
без всяких бесконечностей
O_o

Oleg
03.04.2018
05:11:14
И стрикт лист, его область значений меньше, чем у прелюдного. Именно на множество вот тех бесконечных списков. Так что это не совсем "аналог"

Theta
03.04.2018
05:13:12
А... то есть список юез nil....
data Stream a = Cons a (Stream a)
окей, но там было с nil... либо тотальное недопонимание возникло друг друга
ну такой бесконечный список конечно да, не может
но строка это эе конечный список
стандартный

Oleg
03.04.2018
05:14:04

Theta
03.04.2018
05:14:44
Не обязательно
Но с другой стороны очевидно что бесконечная структура и не может быть строгой
в чём суть вопроса тогда?
Конечные строки могут быть строгими
Либо недопониание, либо запутывание какое-то T_T
Ещё до этого перепутал с трансформерами... правда признал за собой косяк

Oleg
03.04.2018
05:17:41

Index
03.04.2018
05:17:45
Я кстати ошибся про то, что tie the knot можно сделать строгим. Сейчас проверил в GHCi, уходит в бесконечный цикл, видимо при конструировании тоже seq там

Oleg
03.04.2018
05:18:02

Index
03.04.2018
05:18:37
Ну я вот так попробовал:
Prelude> data List a = Nil | Cons !a !(List a)
Prelude> repeat a = let x = Cons a x in x

Google

Index
03.04.2018
05:18:48
Оно видимо вставил seq x и сломалось
repeat () циклится

Theta
03.04.2018
05:19:26
Чтобы ты это сказал.
да, но упора как-то не было на бескончность. соответственно я подумал о реализации для хранения некоторой конечной структуры данных... ну ок, возможно и недопонимание вышло.

Oleg
03.04.2018
05:20:01

Theta
03.04.2018
05:20:32
И в контексте данного вопроса, в чём ещё?
В заглушке в виде undefined?

Oleg
03.04.2018
05:20:45
в любом боттоме

Theta
03.04.2018
05:20:54
Никто не говорит об эквивалентности строгого и нестрогого
и не говорил
что делает всё же несколько бессмысленным вопрос

Oleg
03.04.2018
05:21:12

Theta
03.04.2018
05:21:54
в любом боттоме
ну про боттом я уже итак сказал... назвав заглушками undefined
из-за аналогии...

Oleg
03.04.2018
05:22:31
есть боттомы помимо бесконечной рекурсии и undefined

Theta
03.04.2018
05:23:41
ну извините, https://wiki.haskell.org/Bottom

Oleg
03.04.2018
05:24:12

Theta
03.04.2018
05:25:22
да как бы не за что, но ведь undefined это заглушка, которая возвращает bottom. Невычисленный конец

Oleg
03.04.2018
05:25:46
есть боттомы помимо бесконечной рекурсии и undefined

Index
03.04.2018
05:25:48

Oleg
03.04.2018
05:26:14

Google

Index
03.04.2018
05:26:26
error это вызов throw, так что из той же серии
undefined = error "Prelude: undefined"
error s = throw (ErrorCall s)
примерно

Alexander
03.04.2018
05:27:00
списки конечно можно сделать строгими, но с ними будет все плохо - достаточно бесполезная структура

Theta
03.04.2018
05:27:05
Ну допустим неправильно сказал "заглушка undefined" замените на bottom

Alexander
03.04.2018
05:27:29
на пустом месте получим увеличение сложности и необходимость костылей
пример длинного поста на тему https://gist.github.com/klapaucius/1405389

Index
03.04.2018
05:28:10
@qnikst скажи, так возможно сделать tie the knot со строгим списком? Теоретически не вижу причин почему, т.к. в repeat 1 и голова и хвост могут быть в WHNF, но на практике не вышло

Alexander
03.04.2018
05:28:18
сейчас попробую

Theta
03.04.2018
05:28:22
и это очевидно, что это ключевое отличие строгого от ленивого и делает реализации неэквивалентными, однако судя по тому, что вопрос был, можно ли реализовать что либо вообще строго, соответственно, допускаются некоторые отклонения от эквивалентности
почему бы и не допустить, что кроме отсутствия боттома допускаем отсутствие бесконечности?

Alexander
03.04.2018
05:29:45
судя по ответу интервьюверов близок к тому, про что они хотели поговорить

Oleg
03.04.2018
05:29:46
Короче, нет. Не вышло. Не оправдан. Собес провалил не зр.

Alexander
03.04.2018
05:31:44
@int_index у меня не получилось, даже с irrefutable patterns

Theta
03.04.2018
05:32:09

Alexander
03.04.2018
05:32:57
ну это будет список строго меньший по возможностям
т.е. если они хотят бесконечные списки - так не сделать со строгим

Theta
03.04.2018
05:34:17
Ну это само собой))
Собственно, кто захочет бесконечный строгий тип?

Alexander
03.04.2018
05:35:04
точнее создать то можно