Распечатать список списков целых чисел с Haskell, возвращенных CombinatoricsGeneration.combission - PullRequest
1 голос
/ 05 октября 2010

Я уже искал в Интернете, у меня есть Real World Haskell, но я не могу понять, как напечатать список списков целых чисел, когда этот список возвращается combinatoricsGeneration.combination.

Я нашел модуль вhttp://www.polyomino.f2s.com/david/haskell/combinatorics.html Функции не имеют сигнатуры типа, поэтому Haskell должен делать все выводы.Я даже пытался добавить подписи, но ошибка все еще есть (более конкретная).

Исходный код, который я использую из этого модуля:

combinationsOf 0 _ = [[]]
combinationsOf _ [] = []
combinationsOf k (x:xs) = map (x:) (combinationsOf (k-1) xs)
                          ++ combinationsOf k xs

combinations k n = combinationsOf k [1..n]

Я добавил следующие подписи, чтобы увидетьесли это что-то изменило, но это не так:

combinationsOf :: Integer -> [a] -> [[a]]
combinations :: Integer -> Integer -> [[Integer]]

Мой исходный файл на Haskell:

module Main
    where
        import IO
        import qualified CombinatoricsGeneration as CG

        main = putStr $ unlines $ map show CG.combinations(6, 8)

Компиляция CombinatoricsGeneration в порядке.Но один из моих исходных файлов выдает ошибку:

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.12.3
$ ghc -c CombinatoricsGeneration.hs 
$ ghc -o test  CombinatoricsGeneration.o test.hs 

test.hs:6:37:
Couldn't match expected type `[a]'
       against inferred type `t -> t1 -> [[t1]]'
In the second argument of `map', namely `CG.combinations'
In the second argument of `($)', namely
    `map show CG.combinations (6, 8)'
In the second argument of `($)', namely
    `unlines $ map show CG.combinations (6, 8)'

Однако следующая строка отлично работает:

main = putStr $ unlines $ map show [[1,2],[2],[3]]

Не могли бы вы помочь мне отобразить этот простой список?

1024 * ТИА *

1 Ответ

3 голосов
/ 05 октября 2010

Вы вызываете функцию неправильно.(6, 8) - это кортеж (Num a1, Num a2) => (a1, a2), поэтому

CG.combinations(6, 8)

фактически потребует подпись CG.combinations как

(Num a1, Num a2) => (a1, a2) -> b

вместо a1 -> a2 -> b.

Существует также проблема с приоритетом, поскольку map show будет применяться к функции CG.combinations вместо результата CG.combinations (6, 8).

Вы должны вызывать функцию как

putStr $ unlines $ map show (CG.combinations 6 8)
-- #                        ^^^^^^^^^^^^^^^^^^^^^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...