Size: a a a

2021 March 04

к

кана in Haskell
кидать эксшепшен когда?
источник

к

кана in Haskell
окей, я ща напишу вариант один
источник

к

кана in Haskell
можно выводить из типа результата
источник

IK

Ilya Kos in Haskell
Ilya Kos
class Foo f a b | f -> a b where apply :: [a] -> f -> b
Да, такое должно сработать
источник

к

кана in Haskell
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}

import GHC.TypeLits

data N = Z | S N

type family ArgsC a b t where
 ArgsC a b (a -> x) = S (ArgsC a b x)
 ArgsC a b b = Z
 ArgsC _ _ _ = TypeError (Text "error")

type family MakeF a b n where
 MakeF a b Z = b
 MakeF a b (S n) = a -> MakeF a b n

class F n where
 f :: [a] -> MakeF a b n -> b

instance F Z where
 f [] h = h
 f _ _ = error "invalid length"

instance F n => F (S n) where
 f (x : xs) h = f @n xs (h x)
 f _ _ = error "invalid length"

f' :: forall n a b t. (n ~ ArgsC a b t, t ~ MakeF a b n, F n) => [a] -> t -> b
f' = f @n

main = do
 let xs :: [Int] = [1, 2, 3]
 let h :: Int -> Int -> Int -> String = \a b c -> show (a + b + c)
 putStrLn (f' xs h)
источник

к

кана in Haskell
работает из-за того что f' xs h имеет явный тип String
источник

к

кана in Haskell
Ilya Kos
Да, такое должно сработать
вроде не сработает как раз потому, что b тоже может быть функцией a -> b, а нет констрейнта на то, что b это точно не функция, будет ошибка фандепов у инстанса
источник

[

[BRM]White Rabbit in Haskell
GNU/Vsevolod
Есть что-то наподобие
:: [a] -> (a -> a -> a -> b) -> b?
Т.е. uncurry, только для списков.
take 3 и рекурсивно применить...
источник

к

кана in Haskell
к чему рекурсивно применять?
источник

[

[BRM]White Rabbit in Haskell
К функции (a -> a -> a-> b)
источник

к

кана in Haskell
data X = X Int Int
f [1, 2] X

вот пример какой-нибудь
источник

к

кана in Haskell
[BRM]White Rabbit
К функции (a -> a -> a-> b)
так тип функции после каждого применения будет разный
источник

[

[BRM]White Rabbit in Haskell
🤔
источник

к

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

к

кана in Haskell
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}

import GHC.TypeLits

data N = Z | S N

data Vect n a where
 Nil :: Vect Z a
 (:::) :: a -> Vect n a -> Vect (S n) a

infixr 5 :::

type family MakeF a b n where
 MakeF a b Z = b
 MakeF a b (S n) = a -> MakeF a b n

apply :: MakeF a b n -> Vect n a -> b
apply f Nil = f
apply f (x ::: xs) = apply (f x) xs

main = putStrLn $ apply (\a b c -> show (a + b + c)) (1 ::: 2 ::: 3 ::: Nil)
источник

[

[BRM]White Rabbit in Haskell
Сделать 16 одинаковых функций🌚
Чёт типа
foo1:: [a] -> (a -> b) -> b
foo1 (x:xs) f = f x
foo1 _ = error "ti neprav"

foo2 :: [a] -> (a -> a -> b) -> b
foo2 (x : y : ys) f = foo1 . f y


И т.д.
источник

IK

Ilya Kos in Haskell
кана
вроде не сработает как раз потому, что b тоже может быть функцией a -> b, а нет констрейнта на то, что b это точно не функция, будет ошибка фандепов у инстанса
Для этого есть тайпфемили
источник

IK

Ilya Kos in Haskell
Закрытые
источник

IK

Ilya Kos in Haskell
Которые будут в инстансах использоваться
источник

к

кана in Haskell
[BRM]White Rabbit
Сделать 16 одинаковых функций🌚
Чёт типа
foo1:: [a] -> (a -> b) -> b
foo1 (x:xs) f = f x
foo1 _ = error "ti neprav"

foo2 :: [a] -> (a -> a -> b) -> b
foo2 (x : y : ys) f = foo1 . f y


И т.д.
дык зачем, выше я сделал как раз общую функцию foo @n, которая работае для любого n

foo1 = foo @1
foo2 = foo @2
источник