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

Спасибо, стало ясно имеется еще пара вопросов тогда: 1) почему instance {-# OVERLAPPING

#-} (KnownSymbol name, name ~ "") => Cls name where
f = "empty symbol"

instance {-# OVERLAPPABLE #-} (KnownSymbol anyName) => Cls anyName where
f = "any symbol"

не заводится и ругается на на duplicate instance declarations , хотя чисто интуитивно инстанс для пустого символа и констрейнт на равенство пустой строке должны быть эквивалентны

2) если все-таки очень хочется чтобы для значений, не известных в компайл-тайме, выбирался инстанс с empty symbol , есть ли какие-то воркэраунды?

14 ответов

7 просмотров

потому что инстансы выбираются только по части после => (называется instance head)

по пункту 2 — запихать логику проверки на empty в один инстанс для KnownSymbol name => Cls name

https://hackernoon.com/typeclass-instance-selection-fea1068920e6

Maxim Koltsov
потому что инстансы выбираются только по части пос...

Насколько я понимаю OVERLAPS/OVERLAPPING решается только когда однозначно понятно, в отличии от инкохерента. Это, например, дает ошибку class Foo (x :: Nat) where x :: String instance {-# OVERLAPS #-} Foo 0 where x = "zero" instance {-# OVERLAPPING #-} KnownNat n => Foo n where x = show $ natVal $ Proxy @n foo :: forall n . KnownNat n => String foo = x @n

Dmitriy-Mozhevitin Автор вопроса
Maxim Koltsov
по пункту 2 — запихать логику проверки на empty в ...

а на оба стула — компайл-тайм проверку для константных значений и рантайм-проверку для неизвестных в компайл-тайме значений не усесться?

aadaa_ftgaa
Насколько я понимаю OVERLAPS/OVERLAPPING решается ...

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

Ilya Kos
Тут не работает потому что тут два интанса могут п...

Да, вопрос-то почему работает это bar :: SomeNat -> String bar (SomeNat (Proxy :: Proxy n)) = x @n При том что такое ожидаемо не работает baz :: (forall r . (forall n . KnownNat n => Proxy n -> r) -> r) -> String baz f = f \(Proxy :: Proxy n) -> x @n

Чтобы сделать то что ты тут хочешь надо name ~ “” вынести в голову (после `=>`). Читать тут: https://kseo.github.io/posts/2017-02-05-avoid-overlapping-instances-with-closed-type-families.html

aadaa_ftgaa
Да, вопрос-то почему работает это bar :: SomeNat ...

Мне кажется, он всегда будет выводить число, даже есть передать 0

aadaa_ftgaa
Да, вопрос-то почему работает это bar :: SomeNat ...

Мне кажется, тут разница в том что в пером у тебя из-за GADT вводится в скоуп новый тип, а во втором ты конструируешь значение типы `forall n . KnownNat n => Proxy n -> r` и это *значение* пытает тайпчекнутся. В первом случае у тебя эта переменная не пытается тайпчекнутся извне.

Dmitriy-Mozhevitin Автор вопроса
Ilya Kos
Чтобы сделать то что ты тут хочешь надо name ~ “” ...

сколотил что-то типа такого class Cls (name :: Symbol) where f :: String instance (IsEmpty name ~ flag, Cls' flag name) => Cls name where f = f' @flag @name (Proxy :: Proxy flag) class Cls' (flag :: Bool) (name :: Symbol) where f' :: Proxy flag -> String instance Cls' 'True name where f' _ = "empty symbol" instance Cls' 'False anyName where f' _ = "any symbol" type family (IsEmpty (a :: Symbol)) :: Bool where IsEmpty "" = 'True IsEmpty _ = 'False main :: IO () main = do let s = "" let someSymb = someSymbolVal s case someSymb of (SomeSymbol (p :: Proxy w)) -> putStrLn $ f @w при вызове f @w ругается на • Could not deduce (Cls' (IsEmpty n) n) arising from a use of ‘f’ from the context: KnownSymbol n я правильно понимаю что это из-за того, что неизвестен результат IsEmpty w в компайл-тайме?

aadaa_ftgaa
Да, вопрос-то почему работает это bar :: SomeNat ...

Зарепорчу пожалуй, очень надеюсь что это баг

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

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

type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
45
А чем вам питонисты не угодили?😂
.
79
Можно ли загрузить скрипт py в бота чтобы он работал по нему? как это сделать?
huskadam #RCC Фанат? @hitlerpvp
13
Всем здравствуйте! Я хотел узнать сколько стоит средняя месячная зарплата у Electron js разработчиков? Мне очень это важно и нужно, плиз помогите узнать эту инфу! Для Джунио...
U.K.
10
А дин типизация это хорошо или плохо?
Alexey
12
Исходники плюс документация? Вы гоните)) демок хватит всем
zamtmn
11
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
76
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Hello. Could you please help me with finding all coordinates within a radius using a spatial index, given that I have a table with coordinates? SET @lng = 37.57925; SET @lat ...
Rinchin G
7
Карта сайта