Дмитрий
Alexander
если много с операций как в шеле то шел или туртл могут уменьшить бойлерплейт
Дмитрий
https://www.stackage.org/lts-11.5/package/shelly-1.7.2
Дмитрий
Вот, что приходит на ум.
Зигохистоморфный
Ну черепашка же
Alexander
да хоть process
Дмитрий
А что за черепашка?
Alexander
Shelly и turle уменьшают бойлерплейт если вы баш в Haskell превращаете
Alexander
но ещё раз повторюсь что чтобы запустить достаточно библиотеки process
Ilya
Есть какой-нибудь стандартный тип данных, чтобы хранить функции произвольной арности a -> a -> a -> a -> ... -> a -> a?
Ilya
пока придумалось такое data F a = N (a -> F a) | C a, например plus = N (\x -> N (\y -> C (x + y)))
кана
я правда немного упростил - убрал лишний поинтфри и лишний экволити. Мб он не лишний, но я не понял, нафига он
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
module Words where
class Variadic a r c | c -> r where
liftV :: ([a] -> r) -> c
instance Variadic a r r where
liftV build = build []
instance Variadic a r c => Variadic a r (a -> c) where
liftV build arg = liftV $ \args -> build (arg : args)
unwordsV :: Variadic String String f => f
unwordsV = liftV unwords
sumV :: Variadic Int Int f => f
sumV = liftV (sum :: [Int] -> Int)
showSumV :: Variadic Int String f => f
showSumV = liftV (show . sum :: [Int] -> String)
main :: IO ()
main = do
print $ unwordsV "abc" "de" "f"
print $ sumV (1 :: Int) (2 :: Int) (3 :: Int)
print $ showSumV (1 :: Int) (2 :: Int) (3 :: Int)
кана
Выше решение systemspace
А, тип
Ilya
Зигохистоморфный
Зигохистоморфный
Kirill
Есть ещё вот такая штука https://hackage.haskell.org/package/universum-1.1.0/docs/Universum-VarArg.html
Ilya
кто это? и чего именно это решение?
Ilya
какой-то задачки?
Зигохистоморфный
И там была такая ката
Ilya
не слышал...
Ilya
ката = задача?
кана
да
Ilya
а можно ссылку на кату тогда уж?
Зигохистоморфный
кана
https://www.codewars.com/kata/one-function-many-arguments-haskell-style
возможно она
кана
да, она
кана
а решение выше - просто обобщение, позволяющие делать из неполивариадик функций поливариадик
Ilya
Ilya
кана
да
Ilya
не, это фигня
Ilya
такую функцию частично не применишь
Ilya
слишком узкое множество функций
Зигохистоморфный
Хотеть от хаскель вариардик это какое-то странное извращение
Зигохистоморфный
Иди на жс тогда пиши)
Ilya
при чём тут жс?
кана
Ilya
Зигохистоморфный
Не понятно зачем такое от хаскель требовать?
Ilya
что значит требовать? хаскель это поддерживает
Ilya
я даже выписал тип уже
Ilya
Есть какой-нибудь стандартный тип данных, чтобы хранить функции произвольной арности a -> a -> a -> a -> ... -> a -> a?
Ilya
пока придумалось такое data F a = N (a -> F a) | C a, например plus = N (\x -> N (\y -> C (x + y)))
Ilya
я лишь поинтересовался, реализован ли такой тип уже где-нибудь
Ilya
чтобы самому не писать бойлерплейт
Зигохистоморфный
Глупости всякие)
Anonymous
при чём тут жс?
На Js такие вещи очень удобно делать.
Кстати, на Эрланге тоже.
Поддерживать - сплошное удовольствие.
Ilya
Ilya
я скорее смотрю в сторону Data.Fix
Alexander
Ilya
но до этого не работал с этим модулем, вот разбираюсь
Alexander
вообще там пара классов типов и все
Зигохистоморфный
Alexander
только аннотацию типов добавить, что уже значение нужно и больше аргументов не будет
Зигохистоморфный
Alexander
не только с принтом, вон ради Лора я такую штуку с sum писал
Зигохистоморфный
cata cata cata cata hylo hylo :D
кана
так, хм
потому что арность функции выводится из контекста использоавния
Зигохистоморфный
кана
если сделать map (sumV 1 2) то он поймет, что ожидается Int -> Int
но вообще да, это такое себе решение имхо, просто интересное
кана
я бы массивом делал
кана
кана
хотя можно добавить фантомный счетчик как в идрисовекторах
кана
но тогда в чем суть)
Зигохистоморфный
С телефона не ок все делать)
Kirill
благодарю премного
Cheese
Ilya
[a] -> a
да, уже понял, спасибо:) они действительно эквивалентны, просто был заскок с частичным применением
кана
по поводу частичного применения:
partially :: ([a] -> b) -> [a] -> ([a] -> b)
partially f args = \args' -> f (args <> args')
Alexander
class (Monad m) => ConfigMonad m where
getConfig :: m Config
instance (Monad m) => ConfigMonad (ReaderT Config m) where
getConfig = ask
instance (ConfigMonad m) => ConfigMonad (ReaderT r m)
where getConfig = lift getConfig
При попытке вызова выдает
Overlapping instances for ConfigMonad (ReaderT Config (ServerPartT IO))(инстансов всего 2), вроде бы с точки зрения математики тут никакого пересечения нет. Я что то не так делаю или это ограничение компилятора?
Alexander
и если сделать newtype с GeneralizedNewtypeDeriving, быдет ли это лучше?