Vladislav
даже есть data family Sing не использовать, принцип там примерно тот же будет
Alexander
принцип тот же
Viacheslav
а можно пример где-то?
Viacheslav
глянуть того о чем вы говорите
Alexander
но написать проще свое,чем использовать большую и страшную либу
Alexander
мне с телефона не удобно, вечером могу, часов после 9 мск
Vladislav
а можно пример где-то?
на примере твоей задачи. Ты хочешь написать тип вроде data Response = Response (p :: Parameters) (Action p), где Action это type family, которая зависит от p (параметров)
Vladislav
в Хаскеле так нельзя, ты не можешь на типах обратиться к p (тёрм, рантайм-значение), хотя в других языках можно
Viacheslav
да про это я в курсе
Vladislav
Соответственно извращаться надо в направлении того, чтобы был параметр p на типах, а не на тёрмах
Viacheslav
в idris я бы эту проблему давно решил(
Vladislav
А, ок. Тогда просто бери синглтоны
Vladislav
Там идея в том, чтобы отразить тёрм на типах
Vladislav
data Bool = False | True
data SBool (b :: Bool) where
STrue :: SBool 'True
SFalse :: SBool 'False
Vladislav
соответствие 1-к-1
Vladislav
Если у тебя известен b в SBool b, то ты знаешь, какой у тебя тёрм (можешь синтезировать)
Vladislav
Если у тебя есть тёрм с некоторыми типом SBool b, то паттерн-матчингом узнаешь параметр b.
Vladislav
В итоге ходишь туда-сюда между этими представлениями Bool, в зависимости от того, надо тебе ссылаться на значение в типах, или не надо.
Vladislav
если экзистенциально квантифицировать, то exists b. SBool b полностью эквивалентно Bool
Vladislav
Это можно даже в коде отразить
data SomeBool = forall b. SomeBool (SBool b)
f :: SomeBool -> Bool
g :: Bool -> SomeBool
f . g = id
g . f = id
Vladislav
Делаешь аналогичное для Parameters
Vladislav
Чтобы поменьше писать вручную, есть страшненькая, но сравнительно удобная библиотека singletons.
Anonymous
здесь нужен forall?
Viacheslav
примерно понял, буду разбираться
Viacheslav
спасибо
Alexander
Vladislav
Да, можно выделить набор возможных вариантов для Action, типа actionType, и иметь Parameters actionType и Action actionType
Anonymous
возможно ли написать функцию map для data Meme = forall a. Meme [a] ?
кана
Ну это будет не функтор как минимум, потому что Meme : *, а не * -> *
Anonymous
если я правильно понимаю то такая функция принимала бы только id
кана
(forall a. a) -> (forall a. a)
Хз даже
Vasiliy
почему же только id, const 42 тоже вполне подходит
Vladislav
Не подходит
кана
Даже id же не подходит
Anonymous
оо
Anonymous
почему?
кана
Ну так id возвращает то же, что и принимает, то есть конкретный тип. А нужно вернуть (forall a. a)
кана
Сработает, если вернуть undefined
кана
const undefined
кана
Теоретически
кана
Сложно что-то с такими типами работать, не могу в голове модель осознать
Vladislav
id подошел бы с impredicative types
Vladislav
Иначе придется писать \x -> x
Vladislav
То есть тёрм подходит, но типы не унифицируются.
Vladislav
А тип мапы будет (forall a. a -> a) -> Meme -> Meme
Vladislav
Поэтому только id из тотальных функций
Vladislav
const undefined тоже подойдет
Vladislav
Может еще seq какой-нибудь.
кана
Хм, значит я все примерно правильно понимаю
Anonymous
а что вообще значит f в (forall x. x -> f x) -> (a, b) -> (f a, f b)?
кана
Любой f : * -> * же
Vladislav
Некий функтор, видимо
Vladislav
Ну то есть любой ☆ -> ☆, но буква обычно f для таких штук из-за того, что чаще всего это функторы
кана
Звёздочку нашел, а стрелочку нет)
Vladislav
Такая клавиатура на телефоне
кана
Оп, че за клава?
Vladislav
Стрелочки нет 😔
Vladislav
Samsung Note дефолтная
Anonymous
а (forall x. forall y. x -> y -> f x y) это любой * -> * -> * ?
Vladislav
Да и звездочка контурная у меня, а не правильная
Vladislav
°•○●□■♤♡◇♧☆▪¤《》¡¿
Vladislav
Вот такой тут репертуар, Агду не попишешь
Vladislav
Anonymous
оок спс
a66ath
https://github.com/neovimhaskell/nvim-hs
Viacheslav
я все еще туплю с тем как заимплементить то что мне нужно
Viacheslav
я хочу сделать что-то вроде вот такого
Viacheslav
singletons [d|
data AIIntent = IntentTask
|]
data AIResult a where
AIResult :: SAIIntent b -> (actionToParam b) -> AIResult b
Viacheslav
то есть грубо говоря, чтобы конструктор принимал на вход некое значение, потом тип, который зависит от этого значения, а итоговый тип индексировался этим значением
Viacheslav
я сейчас просто не понимаю, как написать этот actionToParam
Viacheslav
блин, наткнулся на это и все понял
Viacheslav
https://ocharles.org.uk/blog/posts/2014-02-25-dependent-types-and-plhaskell.html
Anonymous
× в сигнатуре типа значит cartesian product?
(например (∃c. c × (A × c → B)) × A → B )
Arseniy
Олли офигенный чувак
кана
ну да, пара просто
кана
+ же - Either
кана
b^a - a -> b
Anonymous
пара либо любой тип эквивалентный паре?
кана
любой изоморфный
кана
Pair a b = Pair a b
Pair меняем на (,)
(,) a b = (,) a b