Я использую звуковое эквациональное обоснование об определении фильтра с точки зрения foldr?

хорошо, это - определение функции фильтра, использующей foldr:

myFilter p xs = foldr step [] xs
    where step x ys | p x       = x : ys
                    | otherwise = ys

так, например, скажем, у меня есть эта функция:

myFilter odd [1,2,3,4]

таким образом, это будет:

foldr step [] [1,2,3,4]

и это будет

step 1 (foldr step [] [2,3,4])

и это будет

step 1 (step 2 (foldr step [] [3,4]))

и это будет

step 1 (step 2 (step 3 (foldr step [] [4])))

и это будет

step 1 (step 2 (step 3 (step 4 (foldr step [] []))))

и foldr step [] [] [] так:

step 1 (step 2 (step 3 (step 4 [])))

теперь мы на самом деле войдем step функция.
вот определение step в myFilter функция, сверху:

step x ys | p x       = x : ys
          | otherwise = ys

также, я напоминаю Вам это p на самом деле odd функция в нашем примере.

хорошо, снова, мы здесь:

step 1 (step 2 (step 3 (step 4 [])))

и

x = 4 в самом внутреннем step, и 4 не нечетно, таким образом, мы возврат ys, который является []

таким образом, теперь мы получаем это:

step 1 (step 2 (step 3 []))

теперь, в самом внутреннем step, x = 3, и 3 нечетно, таким образом, мы возвращаемся x:ys, который является 3 : [], который является [3], и теперь мы добираемся:

step 1 (step 2 [3])

и теперь, во внутреннем step, x = 2, и 2 не нечетно, таким образом, мы возвращаемся ys, который является [3], таким образом, теперь мы доберемся:

step 1 [3]

и теперь, x = 1, и 1 нечетно, таким образом, мы возвращаемся x : ys, который является 1 : [3], который является [1,3].

Конец :-).

действительно ли я прав во всех своих перемещениях?
большое спасибо :-).

p.s. определение myFilter от книжного Реального мира Haskell, в главе 4.

6
задан duplode 14 August 2015 в 01:28
поделиться

3 ответа

Другой возможностью прокрутки является использование команд ScrollBar. Вы можете сделать это, не спускаясь по VisualTree. При наличии стиля ListBox без границы метод GetScrollViewer () -Method больше не будет работать.

Я использую первый элемент ItemContainerGenerator в качестве объекта CommandTarget для ScrollBar.LineXXXCommand:

Point p = e.GetPosition(itemsControl);
  IInputElement commandTarget = itemsControl.ItemContainerGenerator.ContainerFromIndex(0) as IInputElement;

  if (commandTarget != null)
  {
    if (p.Y < OFFSET_TO_SCROLL)
      ScrollBar.LineUpCommand.Execute(null, commandTarget);
    else if (p.Y > itemsControl.ActualHeight - OFFSET_TO_SCROLL)
      ScrollBar.LineDownCommand.Execute(null, commandTarget);

    if (p.X < OFFSET_TO_SCROLL)
      ScrollBar.LineLeftCommand.Execute(null, commandTarget);
    else if (p.X > itemsControl.ActualWidth - OFFSET_TO_SCROLL)
      ScrollBar.LineRightCommand.Execute(null, commandTarget);
  }

Вызов LineXXXCommands аналогичен щелчку по кнопкам со стрелками ScrollBar: ScrollViewer настраивает определенное количество, которое можно настроить, задав

-121--4044133-

Я бы проголосовал за программирование ограничений по нескольким причинам:

1) CP быстро сообщит вам, если нет расписания, удовлетворяющего вашим ограничениям

2) Похоже, что вы хотите дать вам посильное решение для начала, но позволяют им манипулировать заданиями для улучшения решения. CP тоже хорош в этом.

3) Подход MILP обычно сложен и труден для формулирования, и необходимо искусственно создать объективную функцию.

4) CP не так уж и трудно научиться специально для опытных программистов - он действительно исходит больше от компьютерного сообщества, чем от исследователей операций (как я).

Удачи.

-121--4067367-

Это выглядит правильно для меня при первом чтении.

Однако важно помнить, что чтобы достичь ленивой оценки, Хаскелл на самом деле будет смотреть на вещи в другую сторону. Другими словами, действительная последовательность больше похожа на

step 1 (step 2 (step 3 (step 4 [])))

становится

step 1 <block1>

, которая становится

[1, <block1>]

, то если попытаться вытащить следующий элемент из этого списка, она будет оценивать

[1, step 2 <block2>]

, который становится

[1, <block2>]

, а затем пытаться оценить

[1, step 3 (step 4 [])]

превращается в

[1, step 3 <block3>]

, который становится

[1, 3, <block3>]

и т. д. Мне потребовалось время, чтобы понять. Для меня было нелогичным, что поскольку foldr , кажется, оценивается от "наизнанку", но foldl оценивается от "снаружи в", что foldr будет ленивой (какой он есть), в то время как foldl является строгой. Но если вы думаете об этом так, как я изложил выше, это имеет смысл (для меня, в любом случае).

6
ответ дан 9 December 2019 в 20:43
поделиться

Время ожидания транзакции является ли она MDB? у них другая аннотация. Ссылка предоставляет различные опции для установки тайм-аута транзакции с помощью кода в конфигурационных файлах.

-121--3909792-

Другой возможностью прокрутки является использование ScrollBar-Commands. Вы можете сделать это, не спускаясь по VisualTree. При наличии стиля ListBox без границы метод GetScrollViewer () -Method больше не будет работать.

Я использую первый элемент ItemContainerGenerator в качестве объекта CommandTarget для ScrollBar.LineXXXCommand:

Point p = e.GetPosition(itemsControl);
  IInputElement commandTarget = itemsControl.ItemContainerGenerator.ContainerFromIndex(0) as IInputElement;

  if (commandTarget != null)
  {
    if (p.Y < OFFSET_TO_SCROLL)
      ScrollBar.LineUpCommand.Execute(null, commandTarget);
    else if (p.Y > itemsControl.ActualHeight - OFFSET_TO_SCROLL)
      ScrollBar.LineDownCommand.Execute(null, commandTarget);

    if (p.X < OFFSET_TO_SCROLL)
      ScrollBar.LineLeftCommand.Execute(null, commandTarget);
    else if (p.X > itemsControl.ActualWidth - OFFSET_TO_SCROLL)
      ScrollBar.LineRightCommand.Execute(null, commandTarget);
  }

Вызов LineXXXCommands аналогичен щелчку по кнопкам со стрелками ScrollBar: ScrollViewer настраивает определенное количество, которое можно настроить, задав

-121--4044133-

На первый взгляд, шаги, предпринятые в конкретном примере, выглядят правильно по отдельности. Тем не менее, я хотел бы отметить, что и фильтр , и foldr могут быть с пользой применены к бесконечным спискам - которые должны указывать на то, что порядок ваших шагов неверен в отношении Haskell.

2
ответ дан 9 December 2019 в 20:43
поделиться

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

Если результат вызова myFilter используется (например, напечатан), функция будет оцениваться в следующем порядке:

myFilter odd [1,2,3,4]

Сначала оценивается функция myFilter :

foldr step [] [1,2,3,4]

Теперь foldr является самой внешней функцией и оценивается:

step 1 (foldr step [] [2,3,4])

Теперь этап оценивается, давая 1 , поскольку 1 ] нечетно:

1 : foldr step [] [2,3,4]

Теперь доступен первый элемент списка результатов, который может использоваться вызывающей функцией. Если вызывающая функция также использует следующие элементы, оценка продолжается с foldr :

1 : step 2 (foldr step [] [3,4])

Оценка шага теперь не создает никаких новых элементов, поскольку 2 четно:

1 : foldr step [] [3,4]

Итак, foldr снова:

1 : step 3 (foldr step [] [4])

Теперь оценка step дает 3 :

1 : 3 : foldr step [] [4]

Оценка foldr ;

1 : 3 : step 4 (foldr step [] [])

И шаг еще раз:

1 : 3 : foldr step [] []

Наконец foldr вычисляет пустой список:

1 : 3 : []
4
ответ дан 9 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

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