Точечный Оператор в Haskell: нужно больше объяснения

Или как-то так?

.red, .blue {
      color: white;
    }

    .red {
    background-color: red;
    }

    .blue {
    background-color: blue;

    }

    .row{ 
      overflow: auto;
     }
     

    [class^="col-"] {
        display:table-cell;
        width: 30%;
    }


    .col-7 {
        text-align:center;
        vertical-align: middle;
    }
    .row::after {
      content: "";
      display: table-cell;
      width: 40%;
    }
<div class="row">
      <h1> Example 1</h1> 
      <div class="col-3 red">Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
Why do we use it?
</div>
      <div class="col-7 blue">ipsum ipsum</div>
</div>

82
задан Martin Thoma 25 March 2014 в 17:19
поделиться

5 ответов

Помещенный просто, . композиция функций, точно так же, как в математике:

f (g x) = (f . g) x

В Вашем случае Вы создаете новую функцию, sumEuler это могло также быть определено как это:

sumEuler x = sum (map euler (mkList x))

Стиль в Вашем примере называют стилем "без точек" - аргументы функции опущены. Это делает для более четкого кода во многих случаях. (Это может быть твердо к grok в первый раз, когда Вы видите его, но Вы привыкнете к нему через некоторое время. Это - общая идиома Haskell.)

Если Вы все еще смущены, это может помочь иметь отношение . к чему-то как канал UNIX. Если fвывод становится gвход, вывод которого становится hвход, Вы записали бы это на командной строке как f < x | g | h. В Haskell, . работы как UNIX |, но "назад"- h . g . f $ x. Я нахожу, что эта нотация довольно полезна, скажем, обрабатывая список. Вместо некоторой громоздкой конструкции как map (\x -> x * 2 + 10) [1..10], Вы могли просто записать (+10) . (*2) <$> [1..10]. (И, если Вы хотите только применить ту функцию к единственному значению; это (+10) . (*2) $ 10. Последовательный!)

Wiki Haskell имеет хорошую статью еще с некоторой деталью: http://www.haskell.org/haskellwiki/Pointfree

131
ответ дан jrockway 24 November 2019 в 09:09
поделиться

. оператор составляет функции. Например,

a . b

то, Где и b функции, является новым функция , который выполняет b на его аргументах, тогда на тех результатах. Ваш код

sumEuler = sum . (map euler) . mkList

является точно тем же как:

sumEuler myArgument = sum (map euler (mkList myArgument))

, но надо надеяться легче читать. Причиной там является parens приблизительно карта, которая - Эйлер то, потому что это делает это более ясным, что существует 3 составленные функции: сумма , карта Эйлер и mkList - карта Эйлер является единственной функцией.

24
ответ дан Aaron Hall 24 November 2019 в 09:09
поделиться

sum функция во Вводной части Haskell, не аргумент sumEuler. Это имеет тип

Num a => [a] -> a

, оператор . композиции функций имеет тип

(b -> c) -> (a -> b) -> a -> c

, Таким образом, мы имеем

           euler           ::  Int -> Int
       map                 :: (a   -> b  ) -> [a  ] -> [b  ]
      (map euler)          ::                 [Int] -> [Int]
                    mkList ::          Int -> [Int]
      (map euler) . mkList ::          Int ->          [Int]
sum                        :: Num a =>                 [a  ] -> a
sum . (map euler) . mkList ::          Int ->                   Int

Примечание, которое Int является действительно экземпляром Num typeclass.

22
ответ дан Will Ness 24 November 2019 в 09:09
поделиться

Точечный оператор применяет функцию на левых (sum) к выводу функции справа. В Вашем случае Вы объединяете несколько функций в цепочку вместе - Вы передаете результат mkList к (map euler) и затем передаете результат этого к sum. Этот сайт имеет хорошее введение в несколько из понятий.

4
ответ дан Andy Mikula 24 November 2019 в 09:09
поделиться

. оператор используется для композиции функций. Точно так же, как математика, если Вы имеете к функциям f (x) и g (x), f. g становится f (g (x)).

карта является встроенной функцией, которая применяет функцию к списку. Путем помещения функции в круглые скобки функцию рассматривают как аргумент. Термин для этого приправляющий карри . Необходимо искать это.

то, Что, делает то, что это берет функцию с, говорят, что два аргумента, это применяет аргумент Эйлер. (отобразите Эйлера), право? и результатом является новая функция, которая берет только один аргумент.

сумма. (отобразите Эйлера). mkList является в основном необычным способом поместить все это вместе. Я должен сказать, мой Haskell немного ржав, но возможно можно поместить ту последнюю функцию вместе сами?

11
ответ дан John Leidegren 24 November 2019 в 09:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: