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

Коллеги, такая проблема: есть некий объект (мне потребовалось убрать m из

параметров, поэтому экзистеншиал)
data Alg p where
Alg :: forall m p . (Monad m, Eq p) => {
select :: m Direction,
step :: Direction -> p -> m p,
stopCond :: p -> m Bool
} -> Alg p

Как теперь написать алгоритм, использующий эти "методы"? Наивная попытка

algorithm :: forall m p . (Monad m, Show p) => Alg p -> p -> m [p]
algorithm Alg{..} start = go start []
where
go :: p -> [p] -> m [p]
go p1 xs = do
stop <- stopCond p1
if stop then return xs
else do
dir <- select
p2 <- step dir p1
go p2 (p2:xs)

вызывает ошибку

Error:(73, 15) warning: [-Wdeferred-type-errors]
• Couldn't match type ‘m1’ with ‘m’

‘m1’ is a rigid type variable bound by
a pattern with constructor:
Alg :: forall (m :: * -> *) p.
(Monad m, Eq p) =>
m Direction -> (Direction -> p -> m p) -> (p -> m Bool) -> Alg p,
in an equation for ‘algorithm’

‘m’ is a rigid type variable bound by
the type signature for:
algorithm :: forall (m :: * -> *) p.
(Monad m, Show p) =>
Alg p -> p -> m [p]

То есть с одной стороны экзистеншиал диктует свой m, с другой стороны сигнатура алгоритма диктует свой m, как бы подсказать компилятору, что они всегда равны?
Почему необходимо было убрать параметр из Alg? Потому что монада может описываться типом, который зависит от этого параметра и тогда получим бесконечный тип, чего конечно хочется избежать.
Какие у меня варианты?

UPD. Похоже нужно всё-таки как-то выживать с Alg m p

1 ответов

2 просмотра

Они как раз по типу не всегда равны

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

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

Такс, блин, таки кто-то знает, каким образом работают макросы stdin/stdout/stderr? Я влез в stdio.h, там определения нет, отладил через асмокод - вызывается функция со странны...
The Bird of Hermes
18
Всем привет, на линуксе лучше на fasm или nasm учиться писать для начала ?
meszjol
14
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Если у меня есть такой класс: Object = {} function Object:new(a_name, a_transform, a_color, a_mesh, a_material, a_shader, a_textures) local private = {} private.n...
Cuarno Vile
4
было так ;void set_http_ver(RESPD* ptr, char* version, uint32_t length) // example: 'RTSP/1.1 ' set_http_ver: mov eax, [esp + 4] mov ecx, [esp + 8] ...
Mixail Frolov
5
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
зачем же переименовывать ? чтобы кол-во участников возросло или вдруг IBM от этого снова на свифте начнет кодить ? Я не понимаю что страшного в том что свифт гавно, если это т...
Oleh Nerzh
10
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
здравствуйте. совершаю вот такую вещь: strcpy(line, (char)current_number); где current number — неподписанный шорт, line — массив чаров. ругань следующая: main.c:29:30: error...
Roberto's Ширгозиев
13
Где закоментить или что то прописать?
Alibek Кulseitov 🇰🇿
7
Карта сайта