Size: a a a

2021 June 09

MP

Misha Puzanov in Haskell
через генерики проще всего наверное
источник

MP

Misha Puzanov in Haskell
при условии конечно, что генерики есть
источник

YS

Yan Shkurinskiy in Haskell
Имеешь ввиду - руками написать?
источник

MP

Misha Puzanov in Haskell
в смысле
data Foo deriving Generic

instance Arbitrary Foo where
   arbitrary = genericArbitrary
   shrink = genericShrink
источник

MP

Misha Puzanov in Haskell
я даже не уверен, что это лучший вариант, но у меня такого дофига в коде
источник

MP

Misha Puzanov in Haskell
и это такой не самый стремный вариант скажем
источник

MP

Misha Puzanov in Haskell
единственная проблема с ним — он может ломать инварианты для каких-то data
источник

MP

Misha Puzanov in Haskell
им нельзя генерировать Data.Map например, потому что он не генерирует сбалансированное дерево
источник

MP

Misha Puzanov in Haskell
и всякое такое
источник

YS

Yan Shkurinskiy in Haskell
О, genericArbitrary я почему-то не видел
источник

YS

Yan Shkurinskiy in Haskell
Гляну, спасибо!
источник

YS

Yan Shkurinskiy in Haskell
блин, я оказывается делал точно так же ( просто забыл
источник

JS

Jerzy Syrowiecki in Haskell
а никак. типы стираются, и передача значения Int не означает передачу словарика Eq Int
источник

ЖК

Жук Короед in Haskell
Типы-то в рантайме стираются, а тут компайл-тайм вычисления.
источник

JS

Jerzy Syrowiecki in Haskell
словарики тоже передаются в рантайме. надо во время компиляции так сделать, чтобы словарик был в рантайме. как?
источник

к

кана in Haskell
а зачем нужен KBool
источник

к

кана in Haskell
это же обычный Bool
источник

JS

Jerzy Syrowiecki in Haskell
если минимизировать пример, будет

cmp :: forall (flag :: Bool) a. If flag (a ~ Int) (Eq a) => a -> a -> Bool
cmp x y = x == y

Could not deduce (Eq a) arising from a use of ‘==’
from the context: If flag (a ~ Int) (Eq a)
источник

JS

Jerzy Syrowiecki in Haskell
я умею это костылять тайпклассом

class Cmp (flag :: Bool) a where
 cmp :: a -> a -> Bool

instance Cmp True Int where
 cmp x y = x == y

instance Eq a => Cmp False a where
 cmp x y = x == y
источник

JS

Jerzy Syrowiecki in Haskell
наверно, проблема в том, что If — это не коструктивная дизъюнкция. нужно что-то вроде Either
источник