Size: a a a

2020 May 18

IK

Ilya Kos in Haskell
Ilya
Кидать ошибку как positive2 в Вашем примере -- это не айс, потому что где потом эта ошибка стрельнет? Не тотальные функции -- вот эта вся тема. Надо заворачивать в MonadFail или MonadThrow.

Я могу представить себе преимущество от наворачивания Template Haskell поверх смарт-конструкторов только для тестов. Там полно мест где значения будут конструироваться из литералов и хочется избежать бесконечных fromJust:

$$(positiveTH 1) vs fromJust . positive $ 1

В боевом коде особых преимуществ TH поверх конструктора наверное нет -- там значения приходят снаружи и рантайм проверки не избежать.

Волковская библиотека позволяет делать рантайм проверки. В случае рантайм проверок вопрос остаётся: 1. Refined Positive Int vs 2. Смарт конструктор Positive vs 3. Int.

Я склоняюсь к 1, потому что предикаты можно композить:

Refined (And Positive Even) Int

А как композить типы с смарт-конструкторами не очень понятно.
Я бы тоже склонялся к 1, но я его библиотеку подробно не изучал

Я бы на самом деле даже без TH это использовал

Я профит от этого вижу в том что вся механика проверки предикатов становится автоматической (не надо руками Смарт конструкторы писать), программисту гарантируется что все значения хорошие, и появляется возможность делать всякие интересности с предикатами типо автоматически вставлять их описание в документацию или автоматически проверять предикаты когда например refined типы как поле джейсона декодишь
источник

IK

Ilya Kos in Haskell
Но когда таким занимался, по глупости взял маленькую либу facts. Там в итоге много чего руками дописывать пришлось
источник

IK

Ilya Kos in Haskell
В плане дописывать библиотечный код
источник

BK

Boris K in Haskell
Alexander Vershilov
Проблема описанная выше гораздо более конкретная, недели описано. 1. stack ни при чём, совершенно неважно чем вы собираете исполняемый файл. 2. А вот OS может быть важной, судя по вопросу это Windows? 3. Если это Windows то может быть важен терминал и установка кодировки. 4 Но скорее важно то, как вы читаете и выводите файл, скорее всего чтение через Data.ByteString.readFile, а вывод через Data.Text.putStrLn с конвертацией через Data.Text.Encoding.decodeUtf8 вам поможет
Module `Data.Text' does not export `putStrLn'
источник

AV

Alexander Vershilov in Haskell
источник

BK

Boris K in Haskell
Пытаюсь
источник

BK

Boris K in Haskell
* Couldn't match expected type `ByteString'                   with actual type `IO ByteString'

ругается вот на этот код:

module Main where
import Data.Text.IO as DTIO
import Data.Text.Encoding as DTE
import Data.ByteString as BS
— ...
utfFromFile4 :: ByteString -> Text
utfFromFile4 txt = DTE.decodeUtf8 txt
— ...
main :: IO()
main = do
   — ...
   DTIO.putStrLn (utfFromFile4 (BS.readFile "installed.txt"))
источник

BK

Boris K in Haskell
Boris K
* Couldn't match expected type `ByteString'                   with actual type `IO ByteString'

ругается вот на этот код:

module Main where
import Data.Text.IO as DTIO
import Data.Text.Encoding as DTE
import Data.ByteString as BS
— ...
utfFromFile4 :: ByteString -> Text
utfFromFile4 txt = DTE.decodeUtf8 txt
— ...
main :: IO()
main = do
   — ...
   DTIO.putStrLn (utfFromFile4 (BS.readFile "installed.txt"))
Я думаю, вот в этом дело:

https://hackage.haskell.org/package/bytestring-0.9.2.0/docs/Data-ByteString.html#t:ByteString
...
Files
readFile :: FilePath -> IO ByteString
источник

YS

Yan Shkurinskiy in Haskell
Ридфайл возвращает IO
источник

YS

Yan Shkurinskiy in Haskell
Boris K
Я думаю, вот в этом дело:

https://hackage.haskell.org/package/bytestring-0.9.2.0/docs/Data-ByteString.html#t:ByteString
...
Files
readFile :: FilePath -> IO ByteString
Бинго!)
источник

BK

Boris K in Haskell
Yan Shkurinskiy
Ридфайл возвращает IO
И как же быть?!
источник

YS

Yan Shkurinskiy in Haskell
Boris K
И как же быть?!
@haskell_learn лучше сюда
источник

JS

Jerzy Syrowiecki in Haskell
Boris K
И как же быть?!
пользоваться стрелкой влево:

do
 result <- readFile ...
 use result
источник

BK

Boris K in Haskell
Jerzy Syrowiecki
пользоваться стрелкой влево:

do
 result <- readFile ...
 use result
Спасибо!
источник

JS

Jerzy Syrowiecki in Haskell
Yan Shkurinskiy
@haskell_learn лучше сюда
в этом чате мы даём ответы любого уровня
источник

YS

Yan Shkurinskiy in Haskell
Jerzy Syrowiecki
в этом чате мы даём ответы любого уровня
Оке
источник

YS

Yan Shkurinskiy in Haskell
Я человека отправил книжки читать)
источник

YS

Yan Shkurinskiy in Haskell
Ни о чем не жалею!
источник

AT

Alexander T in Haskell
Jerzy Syrowiecki
в этом чате мы даём ответы любого уровня
Можно тогда максимально тупой вопрос?
Про аппликативы, функторы, монады.
Я правильно понимаю, что “монада” это всего лишь тип, у которого есть инстанс тайпкласса monad, определяющий байнд/ретурн/юнит/…, и в целом все эти магические слова означают просто присутствие у типа определенных методов работы с ним (в основном по распаковке/запакове значений из/в конструкторы этого типа)?
источник

YS

Yan Shkurinskiy in Haskell
Alexander T
Можно тогда максимально тупой вопрос?
Про аппликативы, функторы, монады.
Я правильно понимаю, что “монада” это всего лишь тип, у которого есть инстанс тайпкласса monad, определяющий байнд/ретурн/юнит/…, и в целом все эти магические слова означают просто присутствие у типа определенных методов работы с ним (в основном по распаковке/запакове значений из/в конструкторы этого типа)?
Конструктор типа*
источник