v = ArrowMap { getArrowMap :: k -> Maybe v }
getArrowMap есть функция типа k -> Maybe v, если да, то не понимаю задачу
https://stepik.org/lesson/7602/step/12?unit=1473
то есть все функции кажуться вырожденными, и не понятно что понимать например под delete key из ArrowMap
getArrowMap :: ArrowMap k v -> k -> Maybe v
Стикер
о, кстати, можно добавить свойство, что insert и delete не трогают другие ключи. если есть k1 /= k2, то значение по ключу k2 должно сохраняться при вставке k1 и при удалении k1
и все это должно сохраняться в рамках Одной функции, хранящейся в типе ? я правильно понял ?
это свойство для всех словарей, для других реализаций тоже. через функцию или через список — не важно
а если ты справшиваешь про newtype ArrowMap k v = ArrowMap { getArrowMap :: k -> Maybe v } то тут написано, что функция хранится в объекте, не в типе
понял буду думать, как реализовать
А для тестов, похоже нужно что то специальное ? поскольку не могу запустить аналогичный большой тест, сюда надо писать самостоятельно инстансе ? deriving не проходит к таким типам ?
не понял вопрос. это какие-то несвязанные вещи. что к чему не подходит?
написал тест аналогичный ListMap, он не запускается, вызов такой аналогично ListMap labelledExamplesResult $ (prop_Ar_func_ok @(Int, String) @(ArrowMap Int String)) функция теста, такая, на нее при таком вызове тоже ругается компилятор prop_Ar_func_ok :: (Show b, MapLike m, Ord a, Eq b) => (a, b) -> ArrowMap a b -> Property prop_Ar_func_ok (key,val) am = conjoin [ln,lj,d,i] where ln = lookup key (delete key am) === Nothing lj = lookup key (insert key val am) === Just val d = lookup key (delete key (insert key val am)) === lookup key (delete key am) i = lookup key (insert key val (delete key am)) === lookup key (insert key val am) все сделано по аналогии, но там был лист, а тут нет, подумал, что что то опять туплю с типами
так вот такое работает, labelledExamplesResult $ (prop_all_ok @(Int, String) @(ListMap Int String)) потому и говорю, что не очень понимаю.... В случае инта, понял, там функция его ждала и ничего не надо, но в случае когда генерились листы, требовалось такое
app/Trys.hs:20:3: error: [GHC-39999] • No instance for ‘QuickCheck-2.14.3:Test.QuickCheck.Arbitrary.CoArbitrary (ArrowMap Int String)’ arising from a use of ‘labelledExamplesResult’ app/Trys.hs:20:29: error: [GHC-39999] • No instance for ‘Ord (ArrowMap Int String)’ arising from a use of ‘prop_Ar_func_ok’ все это при убранном из prop_Ar_func_ok требовании MapLike m, из определения Типа функции
надо в переменную типа подставлять тип. какие типы ты ожидаешь в a и b?
вот тут надо предыдущую ошибку исправить сначала
в а мне нужен (Int, String) - будет key val, а вот b ArrowMap параметризованная соотвественно Int String
Почему это было правильно для ListMap и не правильно для ArrowMap, именно этого я пока не могу понять
ты не этого хочешь. ты хочешь (key, val) :: (Int, String), а чему равен а?
кортеж или я не понял вопрос
там тоже было неправильно, но ты написал основной код без ошибок, поэтому не увидел ошибку в тесте
ты не понял типовые параметры
О как.... Там тогда тоже не понимаю...
Наверняка, вопрос только как их правильно понимать
То есть уже сейчас понятно, что я написал неверный код основной для ArrowMap?
тут у функции, описывающей свойство, 4 параметра: 2 типа и 2 значения. можешь их выписать?
prop_all_ok :: ( Eq a, Ord a, Show a,Eq b, Show b) => (a,b) -> ListMap a b -> Property аргументы (a,b) (Listmap a b) типы (a,b) :: (Int, String) (Listmap Int String)
до последней строчки всё ок, но в последней строке какая-то ерунда, тебе не кажется?
Сдлелал теперь ошибки на отсуствие Eq и Show • No instance for ‘Eq (ArrowMap Int String)’ arising from a use of ‘prop_Ar_func_ok’
ты хочешь (a, b) = (Int, String) ты хочешь ListMap a b = ListMap Int String значит, какие a и b ты хочешь?
это всё ещё предыдущая ошибка в понимании типовых параметров
Пока нет, пока мне казалось, что типы, это типы Аргументов, в случае с ListMap - конструктор типа совпадает по названию с конструктором данных
понимаю, точнее пытаюсь понять ошибку
ну чтоб проверить работу функций инстансе MapLike мне нужно получить пару key val и MapLike такой чтоб по типам совпали пара и мап
лучше переименовать один из них, пока ты их путаешь data ListMap k v = LM [(k, v)] да и в будущем Хаскеле так будет правильнее
это неправильный ответ на мой вопрос. вообще не ответ
тогда я не понимаю вопрос
@Fzhulitov, реши вот эти уравнения
посмотри в репле :type prop_all_ok @(Int, String)
работало, потому что ты написал правильный код, не зависящий от глубины вложенности
Получиться a :: Int b ::String
потому что первый типовой параметр — это а. а ты думал, что это тип первого аргумента-значения, который не а, а (a, b)
Понял.... labelledExamplesResult $ (prop_Ar_func_ok @Int @String) по идее правильный вызов ListMap так работает, Но тут я натыкаюсь на необходимость Show.... • No instance for ‘Show (ArrowMap String Int)’ arising from a use of ‘labelledExamplesResult’ И еще не понятно, почему в ошибке типы в другом порядке....
И вот такое не понятно ghci> :t prop_Ar_func_ok @Int @String prop_Ar_func_ok @Int @String :: String -> Int -> ArrowMap String Int -> Property ghci> :t prop_all_ok @Int @String prop_all_ok @Int @String :: Int -> String -> ListMap Int String -> Property функции написаны на мой взгляд аналогично, почему в Arrow меняется порядок типов не понятно
а покажи весь код
полная копия файла https://play.haskell.org/saved/LActPhwY
И еще вопрос, мне кажеться что тест, можно сделать на MapLike по идее так было бы правильно или нет ?
потому что в сигнатуре сначала упоминается b, потом а. чтобы их расставить в правильном порядке, лучше явно написать forall a b.
только тебе Eq ArrowMap понадобится, а его нельзя написать в общем случае
И что в таком случае делать ? и аналогичный вопрос с Шоу,
ну, я бы написал Eq (ArrowMap Int8 v) и Show аналогичный, с полным перебором
Это все чтоб сделать тесты ? и почему Int8 а не например Bool ?
Bool недостаточно разнообразный. на Int8 больше вероятность поймать ошибку
ну, можно не писать тесты, это для самоуспокоения. лично я такие задачки с QuickCheck решаю
Про полный перебор не очень понял, я же вроде могу сделать тип ArrowMap Int8 String например и написать deriving Eq Show? или что то мешает ? Да не могу, для type не могу дерайвинг, для newtype вот так Multiple declarations of ‘ArrowMap’
Да я понимаю, вторичное объявление конструктора данных.
Обсуждают сегодня