我想知道是否可以将递归函数转换为无点定义。
如果我们采用一个简单的递归函数。
factorial :: int-> int
factorial 0=1
factorial n+1= (n+1) *factorial n
如果我们有非递归定义。
factorial :: int-> int
factorial n= product [1..n]
<=> factorial n = product.enumFromTo 1 n
<=> factorial = product.enumFromTo 1
但是我如何在递归定义上做同样的事情?
我问的原因是我想使
transformationsApply
无点。transformationsApply :: Eq a => a -> ([a] -> [a]) -> [([a], [a])] -> [a] -> Maybe [a]
transformationsApply _ _ [] _= Nothing
transformationsApply wc func ((a,b):xs) (y:ys)
= orElse (transformationApply wc func (y:ys) (a,b))
(transformationsApply wc func xs (y:ys))
上面使用的
transformationApply
定义为transformationApply :: Eq a => a -> (([a] -> [a]) -> ([a] -> (([a], [a]) -> Maybe [a])))
transformationApply wc func xs (a,b)
= mmap ((substitute wc b).func) (match wc a xs)
最佳答案
我建议让您的代码更具可读性,而不是尝试将其转换为难以理解的无点形式。
将函数转换为无点形式的最简单方法是询问lambdabot。现在,当您具有递归函数时,可以使用fix将其转换为非递归函数。这是fact
函数的示例(lambdabot提供的功能的直接转换),您可以看到它的可读性。
import Control.Monad
import Data.Function
if' :: Bool -> a -> a -> a
if' True x _ = x
if' False _ y = y
fact = fix $ ap (flip if' 1 . (0 ==)) . ap (*) . (. subtract 1)