Size: a a a

2021 February 26

к

кана in Haskell
Смог минимизировать баг
источник

к

кана in Haskell
имеем вот 3 таких типа

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}

{-# LANGUAGE GADTs #-}

data Ap f x = Ap (f x)
newtype I a = I a
newtype K a b = T a


1. вариант без типопеременных, тайпчекается
f :: Ap I Int ~ Ap (K Int) [Int, String] => ()
f = ()

2. вариант с типопеременной, но сразу же с ~ - тайпчекается
f :: forall (xs :: [*]). xs ~ [Int, String] => Ap I Int ~ Ap (K Int) xs => ()

3. вариант с типопеременной но без ~ - нет
f :: forall (xs :: [*]). Ap I Int ~ Ap (K Int) xs => ()

   • Couldn't match kind ‘*’ with ‘[*]’
   • In the ambiguity check for ‘f’
источник

к

кана in Haskell
что это за ambiguity check вообще, если AllowAmbiguousTypes включен
источник

ХГ

Хаскелль Моисеевич Г... in Haskell
У меня оно не заработало, кстати. Пауэршелл чо-то ругается, не наладил его.
источник

к

кана in Haskell
кана
имеем вот 3 таких типа

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}

{-# LANGUAGE GADTs #-}

data Ap f x = Ap (f x)
newtype I a = I a
newtype K a b = T a


1. вариант без типопеременных, тайпчекается
f :: Ap I Int ~ Ap (K Int) [Int, String] => ()
f = ()

2. вариант с типопеременной, но сразу же с ~ - тайпчекается
f :: forall (xs :: [*]). xs ~ [Int, String] => Ap I Int ~ Ap (K Int) xs => ()

3. вариант с типопеременной но без ~ - нет
f :: forall (xs :: [*]). Ap I Int ~ Ap (K Int) xs => ()

   • Couldn't match kind ‘*’ with ‘[*]’
   • In the ambiguity check for ‘f’
ругается только если Ap это data, при ньютайпе все ок
источник

AA

A64m AL256m qn<co... in Haskell
Хаскелль Моисеевич Гопник
У меня оно не заработало, кстати. Пауэршелл чо-то ругается, не наладил его.
да любая попытка поставить хачкель другим способом или шоко или мсис2 скорее всего сломает этот способ, он более-менее работает и проверен только для чистой машины, совершенно нереально составить инструкцию для обхода всех ловушек на засранной
источник

к

кана in Haskell
кана
имеем вот 3 таких типа

{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}

{-# LANGUAGE GADTs #-}

data Ap f x = Ap (f x)
newtype I a = I a
newtype K a b = T a


1. вариант без типопеременных, тайпчекается
f :: Ap I Int ~ Ap (K Int) [Int, String] => ()
f = ()

2. вариант с типопеременной, но сразу же с ~ - тайпчекается
f :: forall (xs :: [*]). xs ~ [Int, String] => Ap I Int ~ Ap (K Int) xs => ()

3. вариант с типопеременной но без ~ - нет
f :: forall (xs :: [*]). Ap I Int ~ Ap (K Int) xs => ()

   • Couldn't match kind ‘*’ with ‘[*]’
   • In the ambiguity check for ‘f’
в 9.0.1 лучше не стало

   • Couldn't match kind ‘*’ with ‘[*]’
     Expected: forall (xs :: [*]).
               ((Ap @{*} I Int :: *) ~ (Ap @{[*]} (K @{[*]} Int) xs :: *)) =>
               ()
       Actual: forall (xs :: [*]).
               ((Ap @{*} I Int :: *) ~ (Ap @{[*]} (K @{[*]} Int) xs :: *)) =>
               ()
   • In the ambiguity check for ‘f’
     In the type signature:
       f :: forall (xs :: [*]). Ap I Int ~ Ap (K Int) xs => ()
источник

к

кана in Haskell
обе строки в expected и actual одинаковые офк
источник

G

GNU/Vsevolod in Haskell
В стд есть что-то вида
(a -> b) -> (a, a) -> (b, b)?
И почему
f <$> (a, b) применяет функцию именно ко 2-му элементу?
источник

YS

Yan Shkurinskiy in Haskell
Кажется bifunctor должен справиться
источник

K

Kir in Haskell
GNU/Vsevolod
В стд есть что-то вида
(a -> b) -> (a, a) -> (b, b)?
И почему
f <$> (a, b) применяет функцию именно ко 2-му элементу?
Потому что (,) a b это функтор по b
источник

G

GNU/Vsevolod in Haskell
Yan Shkurinskiy
Кажется bifunctor должен справиться
bimap :: (a->b) -> (c->d) -> (a, c) ?
источник

K

Kir in Haskell
GNU/Vsevolod
В стд есть что-то вида
(a -> b) -> (a, a) -> (b, b)?
И почему
f <$> (a, b) применяет функцию именно ко 2-му элементу?
import Control.Arrow

both f = f *** f
источник

K

Kir in Haskell
GNU/Vsevolod
bimap :: (a->b) -> (c->d) -> (a, c) ?
bimap :: (a -> b) -> (c -> d) -> p a c -> p b d where p = (,)
источник

YS

Yan Shkurinskiy in Haskell
GNU/Vsevolod
bimap :: (a->b) -> (c->d) -> (a, c) ?
источник

YS

Yan Shkurinskiy in Haskell
Ну там более общее
источник

YS

Yan Shkurinskiy in Haskell
Но да
источник

h

hyperaccelerated dra... in Haskell
GNU/Vsevolod
В стд есть что-то вида
(a -> b) -> (a, a) -> (b, b)?
И почему
f <$> (a, b) применяет функцию именно ко 2-му элементу?
в relude есть bimapBoth :: Bifunctor f => (a -> b) -> f a a -> f b b, но если её не используешь, тогда увы
источник

YS

Yan Shkurinskiy in Haskell
Тогда увы, придется использовать обычный стандартный bimap?
источник

YS

Yan Shkurinskiy in Haskell
Для которого не нужен релюд
источник