Size: a a a

2021 June 13

DB

Danil Berestov in Haskell
Repline не пробовал?
источник

N

Nikita Ursol in Haskell
Нет, выглядит интересно конечно
источник

к

кана in Haskell
когда нечего лифтить, то и лифтить не надо
источник

к

кана in Haskell
зачем делать столько ридеров вместо одного не ясно
источник

N

Nikita Ursol in Haskell
🤔🤔🤔🤔
источник

C

Cyberfined in Haskell
Привет. Я пытаюсь сделать авторизацию с помощью метода, описанного в Ghost of Departed Proof. У меня есть тип CanDeleteUser, который может создаваться только в специальном модуле, извне создать значения данного типа нельзя. Есть функция deleteUser, принимающая CanDeleteUser в качестве доказательства, что текущий пользователь может удалить другого пользователя. Если передать в качестве первого аргумента undefined, то пользователь удалится. Есть ли какой-нибудь способ заставить функции, использующие данный тип, вычислять его значения до WKNF?

deleteUser :: CanDeleteUser userId deleteId
          -> Named userId (AuthResult (Entity User))
          -> Named deleteId (Key User)
          -> AppM NoContent
источник

к

кана in Haskell
да, просто сматчить
источник

C

Cyberfined in Haskell
Это я понимаю. Но, мне как пользователю данного типа ничто не мешает не матчить
источник

к

кана in Haskell
data CanDeleteUser userId deleteId = Can
deleteUser :: CanDeleteUser userId deleteId -> ...
deleteUser Can = ...

или

deleteUser !_ = ...
источник

к

кана in Haskell
ну так тут нужно не пользователю типа, а функциям, которые дают апи с этим типом, озаботиться, что никто не передал undefined. deleteUser - одна из таких функций

а вот тот кто уже будет пользоваться deleteUser не сможет передать undefined
источник

к

кана in Haskell
есть еще один способ сделать это, чтобы undefined было передать намного сложнее - перенести из явнопередавемых аргументов в констрейнты
источник

к

кана in Haskell
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}

import Unsafe.Coerce

class CanDelete

delete :: CanDelete => IO ()
delete = print "delete"

newtype X c a = X (c => a)

withAccessToDelete :: forall a. (CanDelete => a) -> a
withAccessToDelete x = unsafeCoerce (X x :: X CanDelete a) ()

main = do
 -- delete -- impossible
 withAccessToDelete do
   delete
источник

C

Cyberfined in Haskell
Надо будет почитать что-то на эту тему, сейчас выглядит, как магия
источник

к

кана in Haskell
но это не особо нужно, там я выше описал как нужно делать
источник

к

кана in Haskell
deleteUser это все еще функция из того модуля, где и CanDelete должен быть, она знает про конструктор и знает, что он нужен. А вот вне ее использовать deleteUser с undefined уже не выйдет
источник

[

[BRM]White Rabbit in Haskell
Кпна, как ты столько узнал о хаскеле не прочтя ни одной книги?🤔
источник

[

[BRM]White Rabbit in Haskell
Чисто доку читал?
источник

к

кана in Haskell
из этого чатика
источник

к

кана in Haskell
ну способ выше я узнал, прочитав сорцы reflection, там это используется для эмуляции имплиситов
источник

C

Cyberfined in Haskell
У меня сейчас так и работает, я явно матчу конструктор. Просто стало интересно, есть ли способ заставлять матчить конструктор
источник