2010-10-05 2 views
1

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

Я нашел модуль в 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]] 

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

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]] 

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

TIA

ответ

3

Вы неправильно вызываете функцию. (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) 
-- #      ^^^^^^^^^^^^^^^^^^^^^ 
+0

Он прекрасно работает. Благодарю. – lkuty

Смежные вопросы