Próbuję zrozumieć funkcjonalne programowanie przez Haskella i mam tak dużo problemów z komponowaniem funkcji.Kompozycja Haskella z dwoma parametrami
Właściwie mam te dwie funkcje:
add:: Integer -> Integer -> Integer
add x y = x + y
sub:: Integer -> Integer -> Integer
sub x y = x - y
Chcę, aby móc je komponować. To nie ma sensu, ale jest to cel nauki.
Co próbowałem:
foo:: (Integer -> Integer) -> (Integer -> Integer) -> Integer
foo = add . sub
Co mam rozumieć:
Haskell wykorzystuje funkcje tylko jeden args, więc wracamy nową funkcję do wykonania po każdym wykonywanie funkcji.
Tak więc pierwszy Integer
jest typem param, a drugi jest typem zwrotnym wygenerowanej funkcji, która musi dodać drugą liczbę.
Spowoduje to powrót inną funkcję (sub
), który będzie sprawia, że ten sam przepływ (powrót funkcji z params etc ...)
mam rację?
Oto mój rzeczywisty kod błędu:
src\Main.hs:23:7:
Couldn't match type `Integer' with `Integer -> Integer'
Expected type: Integer -> (Integer -> Integer) -> Integer
Actual type: Integer -> Integer -> Integer
In the first argument of `(.)', namely `add'
In the expression: add . sub
src\Main.hs:23:13:
Couldn't match type `Integer -> Integer' with `Integer'
Expected type: (Integer -> Integer) -> Integer
Actual type: Integer -> Integer -> Integer
Probable cause: `sub' is applied to too few arguments
In the second argument of `(.)', namely `sub'
In the expression: add . sub
Nie wiem co robię źle.
Czy możesz pomóc mi zrozumieć nieco więcej tego błędu, aby znaleźć rozwiązanie?
Masz rację, że "nie ma sensu" - nie ma pojęcia, jak komponować funkcje binarne w matematyce.Jeśli chcesz, aby miało to sens, musisz najpierw zdefiniować, co oznacza "komponowanie", dodawanie i odejmowanie. – molbdnilo
Twój typ dla foo mówi, że skład dodawania i odejmowania jest funkcją, która bierze dwie * funkcje * ('Integer -> Integer') i zwraca liczbę całkowitą. – molbdnilo