Size: a a a

2020 December 07

к

кана in Haskell Start
error нигде не выскочил, потому что его даже не вычисляли

список можно заматчить не вычисляя его весь

возьмем опять foldr

foldr f z [] = z
foldr f z (x:xs) = f x (foldr f z xs)

подставим f = (:), z = []

foldr (:) [] [] = []
foldr (:) [] (x:xs) = x : foldr (:) [] xs
источник

к

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

JM

John Meow in Haskell Start
кана
ну хорошо, вот функция

f = 1 : repeat 0

чтобы получить первый элемент f достаточно сматчить f в (x:xs) и забрать x, repeat 0 вычислять не нужно, поэтому repeat 0 даже не будет вычисляться

foldr (:) делает точно так же как f
Но ведь foldr нужно выполнить операцию и над нулями
источник

к

кана in Haskell Start
ему нужно будет это сделать ТОЛЬКО если кто-то еще затребует второй элемент, тогда он выполнит операцию над первым нулем
источник

JM

John Meow in Haskell Start
Ну вот хотя бы foldr (+) 0 1:repeat 2
источник

к

кана in Haskell Start
если делать foldr (+) 0
то тогда на бесконечном списке это работать не будет, потому что невозможно частично сматчить число

но если сделать скажем так

data Nat = Zero | Succ Nat
add :: Nat -> Nat -> Nat
add Zero b = b
add (Succ a) b = Succ (add a b)

то уже можно сворачивать так
foldr add Zero
и мы сможем частично сматчить результат свертки бесконечного списка

например чтобы проверить, что результат больше 10, а дальше не вычислять

let ones = repeat (Succ Zero)
let sumOfAllOnes = foldr add Zero ones
case sumOfAllOnes of
 Succ (Succ x) -> print ">= 2"


то есть мы вычисляем ровно до тех пор, пока у нас не будет двух Succ
">= 2"
источник

JM

John Meow in Haskell Start
кана
если делать foldr (+) 0
то тогда на бесконечном списке это работать не будет, потому что невозможно частично сматчить число

но если сделать скажем так

data Nat = Zero | Succ Nat
add :: Nat -> Nat -> Nat
add Zero b = b
add (Succ a) b = Succ (add a b)

то уже можно сворачивать так
foldr add Zero
и мы сможем частично сматчить результат свертки бесконечного списка

например чтобы проверить, что результат больше 10, а дальше не вычислять

let ones = repeat (Succ Zero)
let sumOfAllOnes = foldr add Zero ones
case sumOfAllOnes of
 Succ (Succ x) -> print ">= 2"


то есть мы вычисляем ровно до тех пор, пока у нас не будет двух Succ
">= 2"
То есть оно работает только для операций, в которых результат может не зависеть от одного из операндов?
источник

к

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

к

кана in Haskell Start
при конструировании
Cons x (f y)
на этом моменте можно уже не выполнять f y, пока кому-то не захочется сматчить второй аргумент Cons
источник

к

кана in Haskell Start
x никак не поменяется в зависимости от результата f y, как и Cons останется Cons всегда и не будет заменен на Nil независимо от результатов f y
источник
2020 December 08

AP

Aleksei (astynax) Pi... in Haskell Start
Aleksey Kislitsa
Это сейчас рекомендуемый плагин для vscode
Что с нехреновой навигацией?
Не использую VSCode, поэтому про плагины для неё не знаю.
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Aleksey Kislitsa
Я так и сделал
покажите текущий .cabal
источник

A

Aragaer in Haskell Start
ну вот, начались опять ассемблеры в адвенте
источник

AK

Aleksey Kislitsa in Haskell Start
Aleksei (astynax) Pirogov
покажите текущий .cabal
Вот так не ворчит cabal, но не работает локальная навигация
cabal-version:       >=1.10
-- Initial package description 'test0003.cabal' generated by 'cabal init'.
--   For further documentation, see http://haskell.org/cabal/users-guide/

name:                test0003
version:             0.1.0.0
-- synopsis:
-- description:
-- bug-reports:
-- license:
license-file:        LICENSE
author:              Aleksey Kislitsa
maintainer:          aleksey.kislitsa@gmail.com
-- copyright:
-- category:
build-type:          Simple
extra-source-files:  CHANGELOG.md

library
 exposed-modules: Lib
 -- other-modules: Paths_test0003
 hs-source-dirs: src
 build-depends: base >=4.13 && <4.14
 -- default-language: Haskell2010

executable test0003
 main-is:             Main.hs
 -- other-modules:
 -- other-extensions:
 build-depends:       base >=4.13 && <4.14, test0003
 hs-source-dirs:      app
 default-language:    Haskell2010

Вот так ворчит cabal но начинает работать навигация

cabal-version:       >=1.10
-- Initial package description 'test0003.cabal' generated by 'cabal init'.
--   For further documentation, see http://haskell.org/cabal/users-guide/

name:                test0003
version:             0.1.0.0
-- synopsis:
-- description:
-- bug-reports:
-- license:
license-file:        LICENSE
author:              Aleksey Kislitsa
maintainer:          aleksey.kislitsa@gmail.com
-- copyright:
-- category:
build-type:          Simple
extra-source-files:  CHANGELOG.md

library
 exposed-modules: Lib
 -- other-modules: Paths_test0003
 hs-source-dirs: src
 build-depends: base >=4.13 && <4.14
 -- default-language: Haskell2010

executable test0003
 main-is:             Main.hs
 -- other-modules:
 -- other-extensions:
 build-depends:       base >=4.13 && <4.14, test0003
 hs-source-dirs:      app, src
 default-language:    Haskell2010
источник

AK

Aleksey Kislitsa in Haskell Start
Aleksei (astynax) Pirogov
Не использую VSCode, поэтому про плагины для неё не знаю.
Мне как раз нужно VSCode плагин запинать или заменить, так как в консоли и stack и cabal работают и проекты собирают.
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Aleksey Kislitsa
Вот так не ворчит cabal, но не работает локальная навигация
cabal-version:       >=1.10
-- Initial package description 'test0003.cabal' generated by 'cabal init'.
--   For further documentation, see http://haskell.org/cabal/users-guide/

name:                test0003
version:             0.1.0.0
-- synopsis:
-- description:
-- bug-reports:
-- license:
license-file:        LICENSE
author:              Aleksey Kislitsa
maintainer:          aleksey.kislitsa@gmail.com
-- copyright:
-- category:
build-type:          Simple
extra-source-files:  CHANGELOG.md

library
 exposed-modules: Lib
 -- other-modules: Paths_test0003
 hs-source-dirs: src
 build-depends: base >=4.13 && <4.14
 -- default-language: Haskell2010

executable test0003
 main-is:             Main.hs
 -- other-modules:
 -- other-extensions:
 build-depends:       base >=4.13 && <4.14, test0003
 hs-source-dirs:      app
 default-language:    Haskell2010

Вот так ворчит cabal но начинает работать навигация

cabal-version:       >=1.10
-- Initial package description 'test0003.cabal' generated by 'cabal init'.
--   For further documentation, see http://haskell.org/cabal/users-guide/

name:                test0003
version:             0.1.0.0
-- synopsis:
-- description:
-- bug-reports:
-- license:
license-file:        LICENSE
author:              Aleksey Kislitsa
maintainer:          aleksey.kislitsa@gmail.com
-- copyright:
-- category:
build-type:          Simple
extra-source-files:  CHANGELOG.md

library
 exposed-modules: Lib
 -- other-modules: Paths_test0003
 hs-source-dirs: src
 build-depends: base >=4.13 && <4.14
 -- default-language: Haskell2010

executable test0003
 main-is:             Main.hs
 -- other-modules:
 -- other-extensions:
 build-depends:       base >=4.13 && <4.14, test0003
 hs-source-dirs:      app, src
 default-language:    Haskell2010
В первом варианте библиотека всё ещё не подключена к executable
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Хотя не, вижу
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Но второй вариант в принципе не корректен. Потому что одни и те же модули приходят с библиотекой и из директории
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Code Runner нужно настроить, чтобы делал cabal run. Вот вам и будет "запуск"
источник

AP

Aleksei (astynax) Pi... in Haskell Start
https://marketplace.visualstudio.com/items?itemName=haskell.haskell использует haskell-language-server. А этот может потребовать описания того, какие модули к чему относятся.
источник