8

それで、私はポイントフリープログラミングについて多くのことを聞き続け、それを理解するために少し実験をすることにしました。これには、先​​のとがった関数を使用して数値の階乗を計算し、それをポイントのない形式に変換することが含まれていました。私はなんとかそれを行うことができましたが、ポイントフリーの結果は、ポイントされた結果よりもはるかに読みにくくなっています。

-- pointed
fact 0 = 1
fact n = n * (fact (n-1))
-- point free
fact' = foldr1 (*) . takeWhile ((<) 0) . iterate (flip (-) 1)

自由な表記法を示すために不可欠なものが欠けていますか、それとも特定の変換が得られるのと同じくらい読みやすいですか?私には、fact関数の大部分はゼロでのパターンマッチングであるように見えます。実際、パターンマッチングは、私がHaskellを愛する最大の理由の1つです。ただし、ポイントフリー表記は、リスト内包表記などの非常に便利な他のいくつかのこととともに、それを完全に禁止しているようです。

4

2 に答える 2

15

ポイントフリー形式の正規階乗は次のとおりです。

fact = product . enumFromTo 1

(これはと同等ですfact n = product [1..n]

これはかなり読みやすいと思います。ただし、元のバージョンには同意します。

fact 0 = 1
fact n = n * (fact (n-1))

定義と非常によく一致し、読みやすくなっています。

ポイントフリー形式のポイント(ha!)は、関数を他の関数の構成として簡単に推論できるようにすることです。ただし、階乗関数は、この種の推論の優れた候補ではありません。

明らかに、決定はあなた次第です。

于 2012-07-19T03:17:45.873 に答える
2

代数和集合のデータ型ごとに、その型のパターンマッチングをカプセル化する活字ケース弁別関数が存在する必要があります。私たちはすでに持っています

either :: (a -> c) -> (b -> c) -> Either a b -> c
maybe :: b -> (a -> b) -> Maybe a -> b

同様に、数のためのそのような関数がなければなりません、

num :: (Num a) => b -> (a -> b) -> a -> b
num z nz 0 = z
num z nz x = nz x

書くことができます

import Control.Applicative
import Data.Function

fact :: (Num a) => a -> a
fact x = num 1 (\x-> (*) (fact (pred x)) x) x
       = num 1 ((*) =<< (fact.pred)) x

すなわち

fact   = (num 1 . ((*) =<<) . (. pred)) fact
       = fix (num 1 . ((*) =<<) . (. pred)) 
于 2013-11-11T10:09:04.130 に答える