169 похожих чатов

А как старый хаскел с новым стыковать ? потому как

тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка
Compilation error

main.hs:10:25: Not in scope: type constructor or class ‘Semigroup’

не очень понимаю, как вообще такие вопросы правильно разрешать ?

131 ответов

219 просмотров

У тебя версии компилятора на степике и на play.haskell совпадают?

Fedor- Автор вопроса
Danila Danko
У тебя версии компилятора на степике и на play.has...

еслиб знал как проверить на степике, ответил бы, а так на плайграунде 9.4.8

Fedor
еслиб знал как проверить на степике, ответил бы, а...

в Playground можно выбирать до 8.4.4, но там уже был Semigroup

Fedor- Автор вопроса
Cheese Syrowiecki
в Playground можно выбирать до 8.4.4, но там уже б...

Кстати вопрос, если в отношении моноида, mempty задан, а в рамках Semigroup как нейтральный обрабатывается другой элемент, Это ошибка ? что то не могу сообразить..... То есть mempty отработает как нейтральный, но еще может отработать другой вход... В моем случае Maybe' Nothing

локально запускать GHC-8.2/lts-11, если можешь запустить локально

Fedor- Автор вопроса
Cheese Syrowiecki
локально запускать GHC-8.2/lts-11, если можешь зап...

понял, могу наверное, но в случае никса, надо писать флайк...

Fedor
понял, могу наверное, но в случае никса, надо писа...

если у тебя не никсос, то ты не обязан использовать никс

вот тут есть онлайн GHC 8.0 https://rextester.com/l/haskell_online_compiler

Fedor- Автор вопроса
Cheese Syrowiecki
если у тебя не никсос, то ты не обязан использоват...

У меня он самый ))) Именно никсос... я даже понимаю как разого дернуть через shell нужную версию.... Это могу решить

Fedor- Автор вопроса
Fedor- Автор вопроса
Fedor
Кстати вопрос, если в отношении моноида, mempty за...

Полугруппе не обязателен нейтральный элемент. Моноид — это как раз полугруппа с таким элементом.

Fedor
Это ошибка по факту.....

не выполняются законы нейтрального элемента?

Fedor- Автор вопроса

Просто моноид делается для Maybe но, Nothing должен быть нейтральным, нейтральным должен, быть Just mempty из a и когда делаю Semigroup приходиться обрабатывать Nothing

Fedor- Автор вопроса
Михаил
Полугруппе не обязателен нейтральный элемент. Моно...

Это понятно, а что если есть два нейтральных (по сути) элементов

Fedor- Автор вопроса
Cheese Syrowiecki
не выполняются законы нейтрального элемента?

В первой реализации, не выполнялись, сейчас пытаюсь собрать чтоб выполнялись..

Fedor
Просто моноид делается для Maybe но, Nothing долже...

кажется, это можно 3 способами сделать, если я правльно тебя понял

Fedor
Это понятно, а что если есть два нейтральных (по с...

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

Fedor- Автор вопроса
Cheese Syrowiecki
кажется, это можно 3 способами сделать, если я пра...

Не точно сформулировал, Nothing по условиям нельзя объявлять нейтральным, Надо mempty из a, моноид Maybe делается для Monoid a

Fedor
Это понятно, а что если есть два нейтральных (по с...

А как такое может быть? Попробуй сложить эти нейтральные элементы: mempty1 <> mempty2. Так как mempty1 нейтральный, то выражение равно mempty2. Но раз mempty2 нейтральный, то выражение равно mempty1. Значит, mempty1 = mempty2. Или же, если это не так, то один из них не по-настоящему нейтральный.

Fedor- Автор вопроса
Cheese Syrowiecki
в математике (а точнее, в теории групп) моноид — э...

Это понимаю, тогда возникает задача, в моем случае обработать Nothing, поскольку в операцию он ничего принести не может, получается что он будет вести себя аналогично mempty, то есть нейтральному элементу... Что похоже и не получается.... Код https://rextester.com/AMXK16979

Fedor- Автор вопроса
Михаил
А как такое может быть? Попробуй сложить эти нейтр...

Ну например майбе для инта, по сложению, 0 нейтрален, когда приходит Nothing можем считать только нулем по логике... Фактически возникает второе обозначение mempty

Fedor- Автор вопроса

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

Fedor- Автор вопроса

Да понял....

Fedor
в данном случае ведет себя как нейтральный, или ег...

Поглощающий элемент. Как 0 в умножении.

Fedor- Автор вопроса
Михаил
Поглощающий элемент. Как 0 в умножении.

Похоже, только вот как разрешать Поглощающий с нейтральным.... Прямо отддельно прописывать, чтоб mempty сохранил свойства по идее ?

Михаил
А как такое может быть? Попробуй сложить эти нейтр...

я подумал про линзу non, которая работает в предположении, что Nothing === Just 0, но это на самом деле говорит не о другом нейтральном элементе, а о другом отношении эквивалентности/равенства

Fedor- Автор вопроса
Cheese Syrowiecki
я подумал про линзу non, которая работает в предпо...

вот выше я пробовал такое без линз, не хочет или я что то не то делаю

Fedor
Это понимаю, тогда возникает задача, в моем случае...

аналогично, но не обязательно идентично

Fedor
вот выше я пробовал такое без линз, не хочет или ...

нет, линза тут для иллюстрации моих мыслей, тебе не нужны линзы в этой задаче. вообще никакого отношения

Fedor
Похоже, только вот как разрешать Поглощающий с ней...

Не обязательно. Если к моноиду добавляют поглощающий элемент, то достаточно прописать, что он поглощает всех (и слева, и справа), а оставшиеся взаимодействия оставить без изменений. Тогда поглощающий элемент будет поглощать в том числе и нейтральный, но это именно то, что и требовалось от них обоих! 0*1 = 0 и по закону 0, и по закону 1.

Fedor- Автор вопроса
Михаил
Не обязательно. Если к моноиду добавляют поглощаю...

То есть, если специально не указано какой закон преобладает, то надо просто угадать ? Просто в кольцах я не помню какихто спец правил, в отношении "сложения" "умножения"

Fedor
То есть, если специально не указано какой закон пр...

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

Fedor
Это понимаю, тогда возникает задача, в моем случае...

mappend (Maybe' (Just mempty)) a = a — неправильный код, здесь переменная mempty создаётся и принимает что угодно. легко обнаружить эту ошибку директивой {-# OPTIONS -Wname-shadowing #-} или сразу {-# OPTIONS -Wall -Werror #-}

Fedor- Автор вопроса
Fedor
То есть, если специально не указано какой закон пр...

В кольцах две операции, а не одна. Поэтому в кольце с единицей вообще не требуется чему-то преобладать, 0 нейтрален по (+), 1 нейтральна по (*). Вот для полей, когда требуется нахождение обратного элемента, уже говорят, что X\{0} должен быть группой по 1.

Fedor- Автор вопроса
Михаил
В том-то и дело, что никакой не преобладает, они с...

Это когда две операции, или моноид с поглощающим.... Я похоже пока уткнулся, в нахождение mempty при сопоставлении с образцом....

Fedor- Автор вопроса
Михаил
В кольцах две операции, а не одна. Поэтому в кольц...

Понял, кольца помнил, поля уже не очень..

Fedor
Это когда две операции, или моноид с поглощающим.....

Потому что это и не требуется. Если ты добавляешь к моноиду элемент, и назначаешь его новым нейтральным, то сопостовлять со старым mempty не требуется, ведь новый нейтральный будет нейтрален ко всем. Если добавляешь поглощающий, то сопоставлять с нейтральным тоже не требуется, ведь поглощающий и так поглощает всех, а нейтральный остаётся нейтральным.

Fedor- Автор вопроса
Михаил
Потому что это и не требуется. Если ты добавляешь...

Есть некий Monoid a Мне нужен Monoid (Maybe' a) where newtype Maybe' a = Maybe' { getMaybe :: Maybe a } deriving (Eq,Show) instance Monoid a => Monoid (Maybe' a) where mempty = Maybe' (Just mempty) mappend (Maybe' (Just a)) (Maybe' (Just b)) = Maybe' (Just (mappend a b)) mappend (Maybe' Nothing) a = a mappend a (Maybe' Nothing) = a вот такое как мне кажеться должно работать, поскольку все Just и так обработаются первым случаем, а обработка Nothing приравнивает его по результатам к mempty базогого типа Но степик дает ответ Wrong answer вроде все проверил, чтоб работало 2 Nothing хотя бы одному надо указать тип, что разумно и добавить mappend (Maybe' Nothing) (Maybe' Nothing) = Maybe' (Just (mempty :: a)) но вот тут указать что mempty типа a, а без ссылки на тип не понятно что вернуть...

Fedor
Есть некий Monoid a Мне нужен Monoid (Maybe' a) w...

У вас инстанс не удовлетворяет законам. Заметьте: вы пишете, что mempty = Maybe' (Just mempty), но из mappend a (Maybe' Nothing) = a следует, что mempty <> Maybe' Nothing = mempty, а не Maybe' Nothing. По вашему mappend нейтрален всё-таки Maybe' Nothing. Как мы говорили, если хотите сохранить старый нейтральный элемент, новый должен не сохранять другие (как у вас), а поглощать их.

Fedor- Автор вопроса
Михаил
Потому что это и не требуется. Если ты добавляешь...

Формально, я не могу сделать Nothing нейтральным, по условиям задачи, могу написать, что вернет результат, аналогичный mempty, это не запрещено вроде...

Fedor- Автор вопроса
Михаил
У вас инстанс не удовлетворяет законам. Заметьте: ...

Да и в этом проблема, я не понимаю как поймать в сопоставлении с образцом (Just mempty)

Fedor- Автор вопроса
Fedor
Да и в этом проблема, я не понимаю как поймать в с...

Ещё раз, зачем? Вы не сможете просто добавить, что Nothing <> Just mempty = Nothing, а для остальных оставить Nothing <> Just a = Just a. Nothing должен поглощать вообще все (NB!!!!!!!!!!!) элементы. Как выглядит уравнение для поглащающего всех!!!!!!!! Maybe' Nothing? Есть ли в нём хоть слово про Maybe' (Just mempty)?

Fedor- Автор вопроса
Михаил
Ещё раз, зачем? Вы не сможете просто добавить, чт...

Понял, то есть ответ, если Nothing не нейтрален - то он обязан быть поглощающим ? я правильно понял?

Fedor- Автор вопроса

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

Fedor
с этим еще не разбирался, но похоже проблема там е...

для этого и нужен квикчек, чтобы опираться на факты, а не на какое-то неточное понимание

Fedor- Автор вопроса
Cheese Syrowiecki
для этого и нужен квикчек, чтобы опираться на факт...

Да понятно надо разобраться с ним.... В данном случае было скорее непонимание, того что если Nothing не нейтрален, то он обязан быть поглощающим....

Fedor
Понял, то есть ответ, если Nothing не нейтрален - ...

Это следует из ассоциативности и невозможности различать элементы старого моноида. Если б на нём было ещё равенство, то ваше добавление "поднейтрального" элемента (сохраняемого нейтральным, но сохраняющего все прочие), стало бы возможно.

Fedor- Автор вопроса
Михаил
Это следует из ассоциативности и невозможности раз...

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

Fedor
Там было EQ, но только в Определении типа для кото...

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

Fedor- Автор вопроса
Михаил
Речь об Eq не просто для одного типа, а об Eq в ко...

просто там инстансе делался для типа Maybe' a у которого есть deriving (Show,Eq) но вот как связываються классы наследуемые с инстансом ддля типа я не очень понимаю..

Fedor
просто там инстансе делался для типа Maybe' a у ко...

Автоматический вывод Eq не означает, что новый тип всегда будет с равенством. В Maybe' a будет равенство, только если оно есть в a.

Fedor- Автор вопроса

deriving

Fedor- Автор вопроса
Cheese Syrowiecki
для этого и нужен квикчек, чтобы опираться на факт...

А что бы почитать по квикчек ? в смысле я вот написал, https://play.haskell.org/saved/VeBicyG6 думаю работает, хорошо бы обвязать тестами, Вопрос как это правильно делать

Fedor
deriving

deriving — это автоматическая реализация инстанса по содержимому типа

Fedor- Автор вопроса
Cheese Syrowiecki
deriving — это автоматическая реализация инстанса ...

То есть - некий тип, реализует этот инстансе. То есть соотвествует классу типов. (это я назвал наследованием, хотя корректнее реализация интерфейса)

Fedor
deriving

только deriving newtype похож на наследование, хотя это тоже не наследование

Fedor
То есть - некий тип, реализует этот инстансе. То...

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

Fedor- Автор вопроса
Cheese Syrowiecki
да, реализация интерфейса — корректнее, но всё ещё...

Это пока не очень понимаю, думаю позже.... Просто мне казалось, что дерайвинг или инстансе EQ например - по результату одно и тоже, если меня устравивает базовая реализация EQ, EQ плохйо пример, лучше Show - позволяет больше реализаций

Fedor
Это пока не очень понимаю, думаю позже.... Просто ...

deriving означает «компилятор, напиши инстанс за меня»

Fedor- Автор вопроса
Cheese Syrowiecki
deriving означает «компилятор, напиши инстанс за м...

Да я так и понимал. Называть наследованием не стоит, постараюсь запомнить

Fedor
А что бы почитать по квикчек ? в смысле я вот нап...

можно начать с функции quickCheck, запустить её вот так: associativity :: (Eq a, Monoid a, Show a) => a -> a -> a -> Property associativity x y z = (x `mappend` y) `mappend` z === x `mappend` (y `mappend` z) quickCheck $ associativity @String

Fedor
А что бы почитать по квикчек ? в смысле я вот нап...

или вот введение https://www.seas.upenn.edu/~cis1940/fall16/lectures/10-testing.html

Fedor- Автор вопроса
Cheese Syrowiecki
можно начать с функции quickCheck, запустить её во...

Это понял, спасибо у меня скорее вопрос про такое например lookup :: Ord k => k -> m k v -> Maybe v к такой функции, я еслиб писал руками тесты, то писал что то типа ls = x : filter (/=x) xxs assert lookup x ls == Just x assert lookup x ls2 == Nothing

Fedor
А что бы почитать по квикчек ? в смысле я вот нап...

а вот ещё я себя бесстыдно порекламирую https://www.youtube.com/watch?v=lL4cA5hcSP0&list=PLL7ZEYyg9KfkZfgWYqpwbokHc4Hezc3C6&index=4&t=841

Fedor- Автор вопроса
Cheese Syrowiecki
а вот ещё я себя бесстыдно порекламирую https://ww...

смотрю, пока не дошел, до составления инстансе Arbitrary, вот только не понимаю пока как, двух параметрический тип, второй параметр, по функциям не важен..... пытался написать такое но неверно prop_finded :: (Ord k, ListMap k l) => k -> l -> Property prop_finded x lM = x == k where (k,v ) = fromJust lookup x lm похоже, не понимаю чего то.... Образцов не нашел.... вот код, как мне кажеться тут нужна Arbitrary https://play.haskell.org/saved/xWpb0JjZ

Fedor
смотрю, пока не дошел, до составления инстансе Arb...

в данном случае можно "наследовать" newtype ListMap k v = ListMap{getListMap :: [(k, v)]} deriving newtype (Arbitrary) deriving stock (Eq, Show)

Fedor- Автор вопроса
Cheese Syrowiecki
в данном случае можно "наследовать" newtype ListM...

В данном, поскольку он собран из примитивов ?

Fedor
В данном, поскольку он собран из примитивов ?

нет, поскольку это обёртка, (почти) не меняющая смысл оборачиваемого

Fedor- Автор вопроса
Cheese Syrowiecki
в данном случае можно "наследовать" newtype ListM...

У мап обычно есть какие-то требования к ключам, например с таким дерайвингом не выполняется lookup k (delete k m) == Nothing

Fedor- Автор вопроса
Nutritional Rabbit
У мап обычно есть какие-то требования к ключам, на...

Это то как раз выполняется, или я чего то не поонимаю, https://play.haskell.org/saved/I4sJ1Tlf влоб такое не тестировал, но должно работать, во всяком случае по требованиям реализации

Fedor- Автор вопроса
Cheese Syrowiecki
в данном случае можно "наследовать" newtype ListM...

А еслиб не подходил, как бы могла примерно выглядеть реализация инстансе ?

Nutritional Rabbit
У мап обычно есть какие-то требования к ключам, на...

выполняется, если delete правильно реализовать

Fedor
А еслиб не подходил, как бы могла примерно выгляде...

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

Fedor- Автор вопроса
Cheese Syrowiecki
если мы не паримся о дублировании ключей, то чтобы...

Это понятно, Про много ключей паримся, не должно быть... не понятен синтаксис, я на нем постоянно ошибаюсь.

Fedor- Автор вопроса
Cheese Syrowiecki
если мы не паримся о дублировании ключей, то чтобы...

и еще мне казалось это должно работать, но не работает sample ( ListMap @Int @String) расширение про DerivingStrategies включил, тогда прошло множественное наследование, а вот вывести что там за варианты генеряться пока не получается.... Причем не понимаю что не так.... Main.hs:10:12: error: • Couldn't match expected type: Gen a0 with actual type: [(Int, String)] -> ListMap Int String • Probable cause: ‘ListMap’ is applied to too few arguments In the first argument of ‘sample’, namely ‘(ListMap @Int @String)’ мне казалось что после дерайвинг, должен быть генератор, определен... Но судя по ошибке, я им как то не так пользуюсь...

Fedor- Автор вопроса
Cheese Syrowiecki
посмотри в репле :type ListMap @Int @String

понял, возиться в плаграунде не стоит, наверное привыкну...

Fedor
и еще мне казалось это должно работать, но не рабо...

после deriving Arbitrary можно пользоваться генератором arbitrary :: Gen a

Fedor- Автор вопроса

ну и зачем ты запихиваешь это в sample?

Fedor- Автор вопроса
Cheese Syrowiecki
ну и зачем ты запихиваешь это в sample?

первая идея была написать arbitrary ListMap, но это не прошло, мне кажеться, что раз появился инстансе, то к нему можно обратиться, но поскольку нельзя генерить примеры, без типов внутренних, предположил что надо их задать.... Я вижу что не понимаю, как этим пользоваться, но пока не понимаю. чего не понимаю.

Fedor- Автор вопроса
Cheese Syrowiecki
зачем?

хотел посмотреть варианты генерации

Fedor
хотел посмотреть варианты генерации

ок, это уже понятная задача > :t arbitrary arbitrary :: forall a. Arbitrary a => Gen a вот генератор чего угодно но я хочу конкретный генератор, например, для Int. arbitrary принимает тип как параметр, можно его задать > :t arbitrary @Int arbitrary @Int :: Gen Int ура, получился конкретный генератор но как из него достать значения? поищем в документации функцию, принимающую Gen. наш лось: > :i generate generate :: forall a. Gen a -> IO a -- Defined in ‘Test.QuickCheck.Gen’ она принимает Gen, а у нас есть Gen. соединяем > :t generate $ arbitrary @Int generate $ arbitrary @Int :: IO Int типы сошлись, получилось действие IO с Int на выходе. отлично, мы знаем, как такие штуки запускать > generate $ arbitrary @Int 30 > generate $ arbitrary @Int 25 > generate $ arbitrary @Int 11 работает!

Fedor- Автор вопроса
Cheese Syrowiecki
ок, это уже понятная задача > :t arbitrary arbitr...

из этой логики получается generate $ arbitrary @ListMap понял, пробую

Fedor- Автор вопроса

Не очень понял, компилятор сказал app/Trys.hs:43:1: error: Illegal use of multiple, consecutive deriving clauses Use DerivingStrategies to allow this нелегальное использование нескольких, последовательных .... я включил расширение, заработало.... Некоректно назвал.... множественными

Fedor
Не очень понял, компилятор сказал app/Trys.hs:43:1...

это множественное, но не наследование

Fedor- Автор вопроса
Cheese Syrowiecki
ок, это уже понятная задача > :t arbitrary arbitr...

вот так смог добиться чтоб работало, но завернут в дополнительный тип, как избежать не понимаю newtype Lis = Lis (ListMap Int String) deriving newtype (Arbitrary) deriving stock (Eq,Show) и тогда выдает результаты generate $ arbitrary @Lis Lis (ListMap {getListMap = [(-2,"\DLE\39678lC%E\1087200\1045603\1036824(Nd"),(-23,"m\1062203o\1066152g{\CANP\SOPIKA"),(2,"w!\EM\\\CAN\199018\"\205299\DC26\985972\190974"),(20,"\1027422wQ\111025V далее обрезал, не значимо

Fedor- Автор вопроса
Fedor- Автор вопроса
Cheese Syrowiecki
удали тип Lis. какая будет ошибка?

вот новый вопрос, вот такой код prop_all_ok :: ( Eq a, Ord a, Show a,Eq b, Show b) => (a,b) -> ListMap a b -> Property prop_all_ok (key,val) lm = conjoin [ln,lj,d,i] where ln = lookup key (delete key lm) === Nothing lj = lookup key (insert key val lm) === Just val d = delete key lm === ListMap ( filter (\(k,_) -> k /= key) (getListMap lm)) i = insert key val (delete key lm) === insert key val lm вызываю его так labelledExamplesResult $ (prop_all_ok @(Int, String) @(ListMap Int String)) Вроде работает, показывает что 100 тест ок.... но возникает вопрос правильности теста.... Хотябы на втой взгляд и куад покопать еще ? В смысле какие еще проверки стоит сделать ?

Fedor
вот новый вопрос, вот такой код prop_all_ok :: ( E...

у тебя тут a = (Int, String), b = ListMap Int String; но думаю, что ты хотел a = Int, b = String

Fedor
вот новый вопрос, вот такой код prop_all_ok :: ( E...

свойство d странное. нет смысла в тесте копировать реализацию

Fedor
вот новый вопрос, вот такой код prop_all_ok :: ( E...

остальные свойства хорошо прописаны, всё правильно

Fedor
вот новый вопрос, вот такой код prop_all_ok :: ( E...

можно ещё проверить свойства пустого словарика. чтение любого ключа из пустого даёт Nothing, удаление из пустого даёт пустой

Fedor- Автор вопроса
Cheese Syrowiecki
свойство d странное. нет смысла в тесте копировать...

я и спрашивал, как бы проверить, не копируя...

Fedor- Автор вопроса
Cheese Syrowiecki
можно ещё проверить свойства пустого словарика. чт...

Так там в данных в листах точно есть пустые, или отдельным проп ом?

Fedor- Автор вопроса
Cheese Syrowiecki
как в ln, lj, i

понял, спасибо, ступил...

Fedor
Так там в данных в листах точно есть пустые, или о...

отдельно. потому что свойство «поиск чего угодно заканчивается Nothing» не работает для любого словаря, только для пустого

Fedor
понял, спасибо, ступил...

ну не надо себя унижать, в тех трёх как раз всё по умному написано, прямо здорово

Fedor- Автор вопроса
Cheese Syrowiecki
ну не надо себя унижать, в тех трёх как раз всё по...

Так и говорю, что когда подумал про этот, не придумал например такого d = delete key (insert key val lm) === delete key lm

Fedor
вот новый вопрос, вот такой код prop_all_ok :: ( E...

лучше свойствам более осмысленные имена давать

Fedor- Автор вопроса
Cheese Syrowiecki
лучше свойствам более осмысленные имена давать

вот смотри написал такое prop_with_empty :: Int -> Property prop_with_empty key = conjoin [l,d] where l = lookup key (empty :: ListMap Int String) === Nothing d = delete key (empty :: ListMap Int String) === (empty :: ListMap Int String) запускаю, вроде осмысленно labelledExamplesResult $ (prop_with_empty @Int ) и ошибка app/Trys.hs:17:29: error: [GHC-95781] • Cannot apply expression of type ‘Int -> Property’ to a visible type argument ‘Int’

Fedor
вот смотри написал такое prop_with_empty :: Int -...

просто прочитай и переведи сообщение об ошибке

Fedor
вот смотри написал такое prop_with_empty :: Int -...

нельзя подставить значение в параметр, если нет параметра. без пруда не вытащишь и рыбку из него

Fedor- Автор вопроса
Fedor
Так есть же.... prop_with_empty key =

это параметр на уровне значений, а ты пытаешься передать Int на уровне типов

Fedor- Автор вопроса
Fedor- Автор вопроса
Cheese Syrowiecki
это параметр на уровне значений, а ты пытаешься пе...

Мне же надо как то указать, что генерировать надо инты, на вход функции

Fedor
ну по аналогии с ассоциативити

рассмотрим f :: forall a. a -> P f x = _ g :: Int -> P g x = _ у первой функции параметры (a :: Type) и (x :: a) у второй — (x :: Int) в первую можно подставить (Int :: Type) (1 :: Int) или (Char :: Type) ('a' :: Char) во вторую можно подставить (2 :: Int), подставить Int некуда, просто нет дырки для этого

Fedor- Автор вопроса

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

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта