2013-07-26 10 views
5

Myślałem o sposobie reprezentowania liczb algebraicznych w Haskell jako strumień przybliżeń. Prawdopodobnie można to zrobić za pomocą jakiegoś algorytmu znajdowania źródeł. Ale to nie jest zabawa. Możesz dodać do wielomianu x, redukując problem, aby znaleźć jego stałe punkty.Czy funkcje wielomianów mogą wykorzystywać funkcje stałoprzecinkowe?

Więc jeśli masz funkcję w Haskell jak

f :: Double -> Double 
f x = x^2 + x 

ja nie koncepcyjnie zrozumieć dlaczego poprawka nie działa, to znaczy, mogę łatwo sprawdzić na sobie, że to nie działa , ale czy nie jest prawdziwym najmniejszym ustalonym punktem f? Czy istnieje inna prosta (jak w definicji wielkości) funkcja o stałym punkcie, która zadziałałaby?

+6

'fix' znajduje najmniejszy _definiowany_ stały punkt, który w wielu przypadkach jest ⊥ (brak zakończenia, błąd, ...). Zobacz także: http://stackoverflow.com/a/8099449/700253 – Vitus

+0

To jest bardzo dobre pytanie, ale uważam, że trudno jest odpowiedzieć bez zbyt abstrakcyjnego podejścia. Próbuję sformułować dobrą odpowiedź. – hivert

+2

Jak twierdzi vitus, porządek, w którym fix znajduje najmniej ustalony punkt, to porządkowanie domen, a nie regularne porządkowanie w Double. – augustss

Odpowiedz

2

Oto implementacja funkcji Fix:

fix :: (a -> a) -> a 
fix f = let x = f x in x 

To nie działa na prymitywnych typów jak Double. Jest przeznaczony dla typów, które mają dla nich bardziej złożoną strukturę. Na przykład:

g :: Maybe Int -> Maybe Int 
g i = Just $ case i of 
    Nothing -> 3 
    Just _ -> 4 

Funkcja ta będzie współpracować z fix ponieważ dostarcza informacji o jego wyniku szybciej niż odczytuje swoje wejście. innymi słowy, część Just jest znana bez patrzenia w ogóle na i, co umożliwia jej osiągnięcie ustalonego punktu.

Gdy funkcja jest Double -> Double, i analizuje jej wejście, fix nie będzie działać, ponieważ nie ma możliwości częściowej oceny Double.