Я пишу программу, чтобы решить результат примитивно рекурсивных функций:Программа для поиска результат примитивно рекурсивных функций
1 --Basic functions------------------------------
2
3 --Zero function
4 z :: Int -> Int
5 z = \_ -> 0
6
7 --Successor function
8 s :: Int -> Int
9 s = \x -> (x + 1)
10
11 --Identity/Projection function generator
12 idnm :: Int -> Int -> ([Int] -> Int)
13 idnm n m = \(x:xs) -> ((x:xs) !! (m-1))
14
15 --Constructors--------------------------------
16
17 --Composition constructor
18 cn :: ([Int] -> Int) -> [([Int] -> Int)] -> ([Int] -> Int)
19 cn f [] = \(x:xs) -> f
20 cn f (g:gs) = \(x:xs) -> (cn (f (g (x:xs))) gs)
эти функции и конструкторы определены здесь: http://en.wikipedia.org/wiki/Primitive_recursive_function
Этот вопрос с моей попыткой создать конструктор compositon, cn. Когда он попадает в базовый регистр, f больше не является частным приложением, а результатом функции. Однако функция ожидает, что функция станет первым аргументом. Как я могу справиться с этой проблемой?
Спасибо.
Там также оператор композиции функций http://tinyurl.com/ykts2pz и статья о том, как писать код без кода http://www.haskell.org/haskellwiki/Pointfree –
Просто примечание: в 'idnm', вы бесполезно сопоставляете шаблоны с конструктором списка': '. Вы можете просто написать 'idnm n m = \ xs -> xs !! (m-1) ', причем оператор' !! 'заставляет тип списка; это упрощается до 'idnm _ m = (!! (m-1))'. Если вы действительно хотите сопоставить шаблон с ':' (возможно, чтобы запретить '[]'), вы можете написать 'idnm _ m xs @ (_: _) = xs !! (М-1) '. –
Ну, все 3 функции сложнее. 'z = const 0; s = succ'. – kennytm