2016-09-01 52 views
6

Ten program Haskella drukuje "1.0" Jak mogę go wydrukować "1"?Formatuj zmienną jako Int podczas drukowania w Haskell

fact 0 = 1 
fact x = x * fact (x-1) 

place m n = (fact m)/(fact n) * (fact (m-n)) 

main = do 
    print (place 0 0) 
+4

_Nigdy nie obliczyć nCr w ten sposób. Jest to bardzo nieefektywne, ponieważ silnia generuje ogromne terminy, które i tak i tak zostaną anulowane (co jest jedynym powodem, dla którego teoretycznie uzyskano wynik całkowy z formuły). Właściwa droga to zwielokrotnienie tylko nieodwołalnych terminów, a nie dzielenie czegokolwiek; wtedy też nie musisz się martwić o zmiennoprzecinkowe. – leftaroundabout

+0

@leftaroundabout, dlaczego nie dasz tej odpowiedzi? – dfeuer

Odpowiedz

10

Stosując operację /, prosicie Haskell użyć typu danych ułamkową. Prawdopodobnie nie chcesz tego w tym przypadku. Zalecane jest użycie typu integralnego, takiego jak Int lub Integer. Dlatego sugeruję wykonać następujące czynności: 1. Dodaj deklarację typu dla funkcji fact, podobnie jak fact :: Integer -> Integer 2. Użyj quot zamiast .

więc kod powinien wyglądać tak:

fact :: Integer -> Integer 
fact 0 = 1 
fact x = x * fact (x-1) 

place :: Integer -> Integer -> Integer 
place m n = (fact m) `quot` (fact n) * (fact (m-n)) 

main = do 
    print (place 0 0) 

Ponadto, jak @leftaroundabout wskazał, prawdopodobnie chcesz użyć lepszego algorytmu do obliczania tych liczb dwumianowego.

+0

Używając tej formuły silni- ka, musisz używać 'Integer' nawet wtedy, gdy oczekujesz raczej małych nakładów. – leftaroundabout

2

mógłby po prostu użyć round:

print (round $ place 0 0)

To zmienia formatowanie do jednego chcesz. Odpowiedź redneb jest jednak właściwym podejściem.