mam zadanie: Wykonaj ćwiczenie z normalizacją wektora, ale używając klasy Haskell. Tworząc funkcję liczącą długość wektora użyj funkcji power poprzedniego tygodnia dekorując ją dekoratorem Haskell. Użyj tej udekorowanej funkcji zarówno do liczenia listy kwadratów jak i do pierwiastkowania sumy. Funkcja powinna zawierać tylko jedną linię, w której zajdzie: pierwiastkowanie ( sumy ( listy kwadratów ( ) ) ) Stwórz funkcję normalizującą wektor z wykorzystaniem funkcji map, dla której przekazywana funkcja to częściowa aplikacja operatora mnożenia wartością: 1 / długość wektora. Tym razem do częściowej aplikacji wykorzystaj udekorowanie funkcji mul. Stwórz drugą wersję funkcji liczącej długość wektora, w której wykorzystaj składanie funkcji. W tym celu musisz wcześniej udekorować Haskellem funkcję sum.
to mój kod:
import operator
from operator import mul
class Haskell:
def __init__(self, func, num_args=None):
self.func = func
self.num_args = func.__code__.co_argcount if num_args==None else num_args
def __pow__(self, other):
return (lambda *args, **kw: self.func(other(*args, **kw)))
def __call__(self, *a):
if len(a) == self.num_args:
return self.func(*a)
def q(*b):
return self.func(*(a + b))
return Haskell(q, self.num_args - len(a))
sum_ = Haskell(sum, 2)
mul = Haskell(mul, 2)
@Haskell
def power(n, x):
return x**n
def dlugosc(vector):
return (power(1/2, sum(map(power(2), vector))))
def dlugosc2(vector):
return power(1/2)(sum_(map(power(2), vector)))#return power(1/2)**(sum(map(power(2)))(vector)
def normalize(vector):
length = dlugosc(vector)
return list(map(mul(1/length),vector))
print(dlugosc2([1,2,2]))
a wynik:
<function Haskell.__pow__.<locals>.<lambda> at 0x7f26eacead90>
czemu nie wyświetla normalnie liczby?