Форум программистов, компьютерный форум, киберфорум
Наши страницы
Haskell
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.85/26: Рейтинг темы: голосов - 26, средняя оценка - 4.85
pcmax
20 / 20 / 5
Регистрация: 29.01.2018
Сообщений: 636
1

Let in

15.03.2019, 02:44. Просмотров 4988. Ответов 33
Метки нет (Все метки)

сори . знаю что надо читать. ребята, но времени нет.
если несложно то на пальцах
хочу сделать функцию локальной
Haskell
1
2
3
4
5
6
7
8
module Main where
let foo :: Int   in func -- тут при объявлении функции хочу сразу указать область ее видимости 
foo =  1
 
func :: Int -> Int 
func x = x + 3
 
main = print $ func foo
но это не работает
0
Catstail
Модератор
24598 / 12506 / 2284
Регистрация: 12.02.2012
Сообщений: 20,321
15.03.2019, 06:43 2
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Haskell
1
2
3
func :: Int -> Int 
func x = x + foo
         where foo = 1
4
nezabudka
947 / 403 / 145
Регистрация: 28.06.2015
Сообщений: 922
Записей в блоге: 15
15.03.2019, 09:01 3
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Haskell
1
2
3
func' :: Int -> Int
func' = foo
  where foo = (+ 1)
Добавлено через 6 минут
В вашем случае можно добавить полиморфизма)
Haskell
1
2
3
func'' :: Enum a => a -> a
func'' = foo
  where foo = succ
Добавлено через 1 минуту
Ага, не правильно поняла задание. Но первый вариант подходит)

Добавлено через 8 минут
Наверное стоит добавить вот эту штучку)
Haskell
1
2
3
main = do
  print $ func' 5
  print $ func'' 'a'
Добавлено через 12 минут
Может вы имели ввиду переменную?
Haskell
1
2
3
main = do
  let foo = 5
  print $ func foo
3
Catstail
Модератор
24598 / 12506 / 2284
Регистрация: 12.02.2012
Сообщений: 20,321
15.03.2019, 09:46 4
Haskell
1
2
3
func :: Int -> Int 
func x = x + (foo x)
         where foo x = x^2 -- локальная функция
3
15.03.2019, 09:46
nezabudka
947 / 403 / 145
Регистрация: 28.06.2015
Сообщений: 922
Записей в блоге: 15
15.03.2019, 10:07 5
Catstail, Я поняла, ваш первый ответ был верным.
1
Curry
2948 / 2017 / 252
Регистрация: 01.06.2013
Сообщений: 4,403
Записей в блоге: 8
15.03.2019, 10:29 6
С let in
Haskell
1
2
3
func :: Int -> Int 
func x = let foo = 1
         in x + foo
3
pcmax
20 / 20 / 5
Регистрация: 29.01.2018
Сообщений: 636
15.03.2019, 15:19  [ТС] 7
ребята, и девчата, все круто, но я хочу понять как работает let in...


Цитата Сообщение от Curry Посмотреть сообщение
func :: Int -> Int
func x = let foo = 1
* * * * *in x + foo


Добавлено через 3 минуты
Цитата Сообщение от Curry Посмотреть сообщение
func :: Int -> Int
func x = let foo = 1
* * * * *in x + foo
а почему мы ее не объявляем?
ну типа foo:: Int
0
XRuZzz
Антикодер
1613 / 774 / 44
Регистрация: 15.09.2012
Сообщений: 2,881
15.03.2019, 16:40 8
Цитата Сообщение от pcmax Посмотреть сообщение
сори . знаю что надо читать. ребята, но времени нет.
Чтение литературы, на которую я давал ссылки - самый короткий путь, я лично на себе проверял . То есть в самом худшем случае мы потратим от одного дня до недели, чтобы понять чего вы хотите и доходчиво это объяснить.
В книге же вы найдёте нужную информацию за один, максимум два дня. Ваша нейронная сеть в голове обладает намного большей скоростью, чем скорость общения в форуме. К тому же она умеет находить нетривиальные решения, которые даже в голову не смогут прийти участникам форума...
Миран Липовача и Денис Москвин лучшие объяснялы Haskell-я, они намного быстрее в книге и курсах вам объяснят сложные вещи, чем мы.
Вот просто нет другого пути, для русских любителей Haskell-я. Нет времени читать - отложите написание кода.
Комплексное обучение включает в себя здоровый образ жизни(ЗОЖ), решение задач, чтение книг, прохождение курсов.

Не по теме:


Мы там долго спорили:
Про НЛО и неопознанное
Наука VS религия
Но я всё же считаю, что лучше когда человек следует за своим сердцем и душевной болью в выборе, что ему делать...
То есть основание для жизни лежит в духовной "плоскости". То есть сначала душа, а потом уже физическое(ЗОЖ), умственное развитие и прочие.


Поэтому очередное тыкание носом. Вот прям, никто лучше и быстрее не объяснит:
LYAH → Let it be
Вырезки из курсов Дениса Москвина - #29 урок. Выражение let...in... (Я сам удивился, что нашёл нужный отрывок за 1 минуту)

Что тут добавить к ссылкам? let ... in ... примитивная конструкция, с которой у людей, которые изучают материалы проблем не возникает.
Если let без in стоит в do нотации, тогда это требует уже понимания как работает do нотация(то есть вам это знать пока рано).
Можно конечно к do на начальном этапе относится как к императивному миру, а не к монадному.
Цитата Сообщение от pcmax Посмотреть сообщение
а почему мы ее не объявляем?
Тут не никакой проблемы(если нужно объявление):
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
func :: Int -> Int
func x =
   let
     foo :: Int
     foo = 1
   in
      x + foo
 
-- то же самое
func :: Int -> Int
func x = let { foo :: Int; foo = 1} in x + foo
 
func :: Int -> Int
func x = let foo :: Int; foo = 1 in x + foo
Ещё может быть не очевидно, что экспериментировать лучше интерпретаторе ghci...

Порог вхождения в Haskell начинается со специального полиморфизма в классах типов(если я правильно выразился). Который без комплексного обучения не преодолеть, как мне кажется.
2
nezabudka
947 / 403 / 145
Регистрация: 28.06.2015
Сообщений: 922
Записей в блоге: 15
15.03.2019, 16:50 9
Я подозреваю, что автор темы спутал как в начале и я переменную foo
с функцией foo. От сюда и непонятки. Нужно смотреть "объявление переменных"
и "область видимости переменных"
Ну и не помешает придерживаться стиля в написании имен
1
pcmax
20 / 20 / 5
Регистрация: 29.01.2018
Сообщений: 636
15.03.2019, 17:12  [ТС] 10
ладно, пока Вы тут все еще добрые, то я осмелюсь еще спросить:
нужно будет чтобы функция вернула функцию.... что я должен указать
Haskell
1
func :: Int -> -- она func  должна вернуть функцию... eсли укажу Int то наверное это будет неправильно
0
XRuZzz
Антикодер
1613 / 774 / 44
Регистрация: 15.09.2012
Сообщений: 2,881
15.03.2019, 17:27 11
Что происходит когда Haskell видит число?
Вырезки из курсов Дениса Москвина → #16 урок. Числовые типы и числовые литералы
0
Curry
2948 / 2017 / 252
Регистрация: 01.06.2013
Сообщений: 4,403
Записей в блоге: 8
15.03.2019, 17:32 12
Насчёт различия let in и where нужно понимать что определения в let видны только от строки определения и ниже, до in включительно.
А определения where видны во всей функции.
По этому
Haskell
1
2
3
4
5
func :: Int -> Int 
func x = let foo = 1
             baz = foo + bar
         in  x + baz
    where bar = 10
Компилируется, а
Haskell
1
2
3
4
func' :: Int -> Int 
func' x = let foo = 1
          in  x + bar
    where bar = foo + 10
нет. foo не видна за пределами let in.

Цитата Сообщение от XRuZzz Посмотреть сообщение
Если let без in стоит в do нотации, тогда это требует уже понимания как работает do нотация(то есть вам это знать пока рано).
Ничего не рано. Так же как без do, только ещё и без in.
Можно побаловаться в монадой Identity которая ничего не делает (заглушка) зато позволяет применить блок do в безмонадной функции.
Haskell
1
2
3
4
5
6
7
8
9
import Data.Functor.Identity
 
func :: Int -> Int 
func x = runIdentity $ do
    let a = 1
        b (y:ys) = a + y + b ys -- b используется в той же строке где определено.
        b [] = 0
    let c = b [a,x]
    return c
Хотя можно использовать любой стандартный тип являющийся монадой, например список
Haskell
1
2
3
4
5
6
7
func :: Int -> Int 
func x = head $ do
    let a = 1
        b (y:ys) = a + y + b ys
        b [] = 0
    let c = b [a,x]
    return c
Понятно, что практической пользы тут нет, просто для понимания.
Цитата Сообщение от nezabudka
Я подозреваю, что автор темы спутал как в начале и я переменную foo
с функцией foo
В Haskell переменных нет. Всё это функции.
2
Tklwegsd
Эксперт 1С
780 / 570 / 194
Регистрация: 24.07.2013
Сообщений: 1,959
15.03.2019, 17:33 13
Цитата Сообщение от pcmax Посмотреть сообщение
нужно будет чтобы функция вернула функцию.... что я должен указать
Нужно указать тип функции, которая будет возвращена.
Haskell
1
func :: Int -> (Int -> Int) -- скобки необязательны из-за правой ассоциативности операции ->
3
Curry
2948 / 2017 / 252
Регистрация: 01.06.2013
Сообщений: 4,403
Записей в блоге: 8
15.03.2019, 17:37 14
Цитата Сообщение от pcmax Посмотреть сообщение
чтобы функция вернула функцию
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
func :: Int -> Int -> Int
func x y =  x + y
-- то же 
func' :: Int -> Int -> Int
func' x = \ y -> x + y 
-- или
func'' :: Int -> Int -> Int
func'' x = fn
  where fn y = x + y 
 
main :: IO ()
main = do
    let f = func 2
    print $ f 1
1
XRuZzz
Антикодер
1613 / 774 / 44
Регистрация: 15.09.2012
Сообщений: 2,881
15.03.2019, 17:38 15
Цитата Сообщение от nezabudka Посмотреть сообщение
переменную
Очень хочется зацепиться за это слово, и сказать, что в Haskell-e нет переменных, по крайней мере, нельзя такое слово употреблять, когда новичкам объясняешь.
Вместо переменных - монады семейства State.
Цитата Сообщение от pcmax Посмотреть сообщение
ладно, пока Вы тут все еще добрые, то я осмелюсь еще спросить:
нужно будет чтобы функция вернула функцию.... что я должен указать
LYAH → HOF
Чтение по сложнее:
Учебник по Haskell → ФВП
Видели как Холомьёв взрывает мозг в этой главе?
Учебник по Haskell → ФВП → Функциональный калькулятор :
Haskell
1
2
*FunNat> 2 2
2
3
Curry
2948 / 2017 / 252
Регистрация: 01.06.2013
Сообщений: 4,403
Записей в блоге: 8
15.03.2019, 17:51 16
Цитата Сообщение от XRuZzz Посмотреть сообщение
в Haskell-e нет переменных, по крайней мере, нельзя такое слово употреблять, когда новичкам объясняешь.
Нет в Haskell переменных. А что, Москвин, о котором вы в каждой теме упоминаете, говорит что есть?
0
korvin_
2702 / 1980 / 354
Регистрация: 28.04.2012
Сообщений: 6,756
15.03.2019, 17:55 17
Цитата Сообщение от XRuZzz Посмотреть сообщение
Очень хочется зацепиться за это слово, и сказать, что в Haskell-e нет переменных, по крайней мере, нельзя такое слово употреблять, когда новичкам объясняешь.
В Хаскелле переменные такие же как в математике. Ну, с некоторыми оговорками, наверное.
3
Catstail
Модератор
24598 / 12506 / 2284
Регистрация: 12.02.2012
Сообщений: 20,321
15.03.2019, 18:00 18
Цитата Сообщение от nezabudka Посмотреть сообщение
спутал как в начале и я переменную foo с функцией foo
- более правильно считать, что константа в Haskell - это тривиальная функция с постоянным значением.
4
Tklwegsd
Эксперт 1С
780 / 570 / 194
Регистрация: 24.07.2013
Сообщений: 1,959
15.03.2019, 18:02 19
Curry, korvin_,
В данном контексте x - это переменная, функция или что?
Haskell
1
f x = x + 1
2
Curry
2948 / 2017 / 252
Регистрация: 01.06.2013
Сообщений: 4,403
Записей в блоге: 8
15.03.2019, 18:04 20
Цитата Сообщение от Tklwegsd Посмотреть сообщение
В данном контексте x - это переменная, функция или что?
аргумент функции.
1
15.03.2019, 18:04
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru