среда, 18 октября 2017 г.

Вопрос

[ [ 1 2 ] [ 3 4 ] ] как на Haskell преобразовать к [ 1 2 3 4 ] ?

Ну или на каком-нибудь другом функциональном языке?

У меня так:

[ [ 1 2 ] [ 3 4 ] ] .Fold

Но у меня же - "на коленке". Хочется понимать как "у людей" устроено.

А [ 1 2 ] .Join [ 3 4 ] как?

А [ 1 2 ] .Map .ToString как?

А [ 1 2 ] .Filter .IsOdd как?

А 0 [ 1 2 ] .For + /*сумма элементов*/ как?

Надеюсь, что смысл примеров понятен. Хотя они конечно "на коленке".

Если они всё же понятны, то может быть кто-то откликнется и расскажет как подобное на настоящих языках можно сделать?

27 комментариев:

  1. Первое, что пришло на ум:

    intercalate [] [[1, 2], [3, 4]]

    Результат:

    [1, 2, 3, 4]

    Первый аргумент функции intercalate - это разделитель между элементами списка, переданного в качестве второго аргумента. То есть можно было бы написать так:

    intercalate [10] [[1, 2], [3, 4], [5, 6]]

    И результат был бы таким:

    [1,2,10,3,4,10,5,6]

    ОтветитьУдалить
    Ответы
    1. intercalate [10] [[1, 2], [3, 4], [5, 6]]

      О! У меня такое есть:

      [ [1 2] [ 3 4 ] [ 5 6] ] [ 10 ] .CatWithSeparator

      Удалить
  2. Но вообще-то это некрасивое решение, избыточное. Лучше просто так:

    concat [[1, 2], [3, 4]]

    ОтветитьУдалить
  3. А concat [ [ 1 2 [ 3 4 ] ] [ 5 6 ] ]

    что сделает?

    А как удалить дубликаты из [ 1 2 3 1 3 4] ?

    ОтветитьУдалить
    Ответы
    1. А как посчитать количество элементов в [ 1 2 3 ] ?

      Count [ 1 2 3 ] ?

      Удалить
  4. > А [ 1 2 ] .Join [ 3 4 ] как?

    [1, 2] ++ [3, 4]

    > А [ 1 2 ] .Map .ToString как?

    map show [1, 2]

    > А [ 1 2 ] .Filter .IsOdd как?

    filter (\x -> x `mod` 2 /= 0) [1, 2, 3, 4, 5, 6]

    А вот последний пример не очень понял, что требуется...

    ОтветитьУдалить
    Ответы
    1. Filter - понял, но что там за кавычки?

      Удалить
    2. Последний пример - сумма элементов массива. "Свёртка" если не ошибаюсь.

      Удалить
    3. А почему \x? Что слеш означает?

      Удалить
    4. -> понятно. Отображение a в b.

      a -> b

      Удалить
    5. > Filter - понял, но что там за кавычки?

      Обратные тики-кавычки нужны для инфиксной записи бинарной функции. То есть мы располагаем mod между аргументами.

      > А почему \x? Что слеш означает?

      \x - это начало лямбда-функции. Воспринимай её как спинку буквы лямбда в оригинальной математической записи. Таким образом, лямбда-функция \x -> x * x возводит свой единственный аргумент в квадрат.

      Удалить
    6. > сумма элементов массива

      sum [1, 2, 3]

      Удалить
    7. А к каждому элементу 1 прибавить?

      [ 1 2 3 ] .Map ( + 1 ) ?

      Удалить
    8. "Обратные тики-кавычки нужны для инфиксной записи бинарной функции. То есть мы располагаем mod между аргументами."

      А иначе польская запись?

      Удалить
    9. "\x - это начало лямбда-функции"

      Понял.

      \ - это "ключевое слово" лямбда?

      Удалить
    10. Фактически \x определяет аргумент и тот факт, что это лямбда?

      Удалить
    11. Sum
      А как произвольную лямбду для пары элементов подать?

      Ну например квадрат?

      Удалить
    12. filter odd [1,2,3,4] же, ну..

      Удалить
  5. Ответы
    1. show - это функция из класса типов Show. Она превращает значение в стандартную String, если есть такая возможность (для чисел, разумеется, есть). http://hackage.haskell.org/package/base-4.10.0.0/docs/Prelude.html#t:Show

      Удалить
    2. Понял! Спасибо. Я так примерно и думал.

      Удалить