我想知道是否可以将递归函数转换为无点定义。

如果我们采用一个简单的递归函数。

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)

10-08 04:21