← All posts tagged Haskell

Shchvova

Ну вот и закончился курс по хаскелю. Впечатления — очень хороший курс, автора молодцы. Хотя часть о монадах чувствую без практике послезавтра выветрится из головы, потому что походу не сильно там и задержалась. Например, я так и не понял как сделать последнее задание при помощи монады State, потому сделал без монад codepad.org
В кратце, есть дерево (), надо переделать в дерево чисел что бы были пронумерованы слева направо.

Shchvova

Помните я говорил wat на туплы хаскеля #2807019? Оказалось что час назад окрылась последняя неделя курсов, где о этом рассказывают прям stepic.org клево.
А еще (1) — это не тупл. Это просто 1 в скобках :( походу хаскель не умеет туплы (как умеет их питон, например)

Shchvova

Prelude> length ("Hello")
5
Prelude> length ("Hello", "World")
1
Prelude> length ("Hello", "World", "!")

<interactive>:7:1:
    No instance for (Foldable ((,,) [Char] [Char]))
      arising from a use of ‘length’
    In the expression: length ("Hello", "World", "!")
    In an equation for ‘it’: it = length ("Hello", "World", "!")

Shchvova

Интересный урок. Но блин, я не сделал 3 заданька. Помощь приветствуется.

1 — сраные галочки. Я вообще не пойму что с меня хотят, и вообще что за хрень спрашивают и почему что-то кроме `emptyOrSingleton False undefined` верно stepic.org

2 — более общий вопрос по хаскелю. Вот я написал кот. Вроде все сходится по типам, но не работает, я не понимаю почему. Как это вообще "дебажить"? stepic.org
Вот мой код — codepad.org

3 — что-то заметил что пропустил. Пока совсем не понял что с меня вообще хотят stepic.org

Shchvova

Долго долбился как написать stepic.org а потом фигак проснулся и написал решения в две строчки... Прям хорошо.
А вот с свертками что-то ступорю.

пока что любимое решение это:

evenOnly :: [a] -> [a]
evenOnly = map snd . filter (even .fst) . zip [1..]

Вот со свертками родил вот это:
evenOnly :: [a] -> [a]
evenOnly = foldr (\(i,x) a -> if even i then x:a else a) [] . zip [1..]

А есть ли что более красивое?

Shchvova

Что-то застопорился неожиданно на https://stepic.org/lesson/12321/step/8
Не пойму, что не так...

perms :: [a] -> [[a]]
perms [] = []
perms [x] = [[x]]
perms (x:xs) = concatMap (interleave x) (perms xs)
  where
    interleave :: a -> [a] -> [[a]]
    interleave a l = interleave' a l []

    interleave' :: a->[a]->[a]->[[a]]
    interleave' a [] rs = [a : rs]
    interleave' a ls@(l:el) rs = (ls ++ [a]  ++ rs) : interleave' a el (l:rs)

Shchvova

на заданьку написал функцию
multSecond = (*) `on` snd
Хаскель говорит что ее тип
multSecond :: (a, Integer) -> (a, Integer) -> Integer
При чем я впритык не понимаю почему a одинаковые. Например, в чем проблема вызвать
multSecond ('A',2) (True,7)
?

Shchvova

так вот. В эрланге принято писать функции так что бы компиляр применял оптимизацию хвостовой рекурсии. Например, функция zipwith/3, получает функцию и два списка на склейку. Вместо того что бы написать

zipwith(_, [], _) -> [];
zipwith(_, _, []) -> [];
zipwith(Pred, [X | Rest1], [Y | Rest2]) -> [ Pred(X, Y) | zipwith(Pred, Rest1, Rest2) ].

будет писать что-то вроде такого:

zipwith(Pred, List1, List2) -> zipwith(Pred, List1, List2, []).

zipwith(_Pred, [], _, Acc) -> task_2:reverse(Acc);
zipwith(_Pred, _, [], Acc) -> task_2:reverse(Acc);
zipwith(Pred, [H1|T1], [H2|T2], Acc) -> zipwith(Pred, T1, T2, [Pred(H1, H2) | Acc]).

А в Haskell так принято делать?

Shchvova

Woo :D Разобрался :) filterM с `const [True, False]` и байндом листовой монады просто флипает вкл/выкл каждый элемент, что мы и хотели :) Ня! С Новым Годом :) Это точно самый интеллектуально напряженный НГ в моей жизни.

НЯЯ! а еще я в D&D вчера играл до 2х ночи а завтра еду в Бостон на экономическую конференцию. Си я пипл!