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)
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)
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.
Używając tej formuły silni- ka, musisz używać 'Integer' nawet wtedy, gdy oczekujesz raczej małych nakładów. – leftaroundabout
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.
_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
@leftaroundabout, dlaczego nie dasz tej odpowiedzi? – dfeuer