Как я могу использовать оператор let для получения комбинаций для суммы подмножества в Haskell?

let rectangles = 
       [(a,b,c,d) | d <- [1..10],c <- [1..10], b <- [1..10], a <- [1..10],a+b+c+d == 22]

У меня есть этот код, который работает, но я хочу сделать это функцией, чтобы я мог изменить значение 22

Всего 1 ответ


Просто добавьте имя аргумента после rectangles и используйте это вместо 22. Пример:

let rectangles perimeter = [(a,b,c,d) | d <- [1..10],c <- [1..10], b <- [1..10], a <-[1..10],
    a+b+c+d == perimeter]




Дополнительная информация


Если вам интересно, вы можете написать функцию Haskell несколькими способами, но только некоторые из них применимы в каждом контексте.

Чтобы определить глобальную функцию, вы опускаете let (и удостоверяетесь, что строка (-ы) не является частью и не является частью какого-либо другого определения).

 rectangles perimeter = [(a,b,c,d) | d <- [1..10],c <- [1..10], b <- [1..10], a <- [1..10],
            perimeter == a+b+c+d]

Внутри определения синтаксис тот же, но окруженный let .. in .

squares = let
              sidelengths ceil = [1..ceil]
          in
              [ (a,a,a,a) | a <- sidelengths 10 ]

Если вам не нравится, вы можете использовать let внутри:

    squares = do
                  let sidelengths ceil = [1..ceil]
                  [ (a,a,a,a) | a <- sidelengths 10 ]

Наконец, в каждом случае вы также можете переместить имя аргумента справа от знака равенства, если вы окружаете его с помощью и -> .

let rectangles = perimeter->
    [(a,b,c,d) | d <- [1..10],c <- [1..10], b <- [1..10], a <-[1..10],
       a+b+c+d == perimeter]

Есть идеи?

10000