접는 기능 인수의 이름은 무엇입니까


10

고차 함수에서 감소 / 배 (있는 경우) 기능 인수의, 이름이 무엇인지?

열을 최소, 최대, 평균을 찾는 것과 같이 간단한 분석을 위해 행을 접는 모나 딕 테이블 형식 처리 라이브러리에서 작업하고 있습니다. 따라서 fold함수 의 인수에 대한 건전한 이름을 찾고 있으며 ML 커뮤니티 (또는 Haskell 또는 Common Lisp의 두 번째 및 세 번째 후보)에서 잘 알려진 이름이 흥미로울 것입니다.

함수 f의 설명에서 와 같은 이름 은 일반적이지만 설명 fold적이 지 않으며 명사가 더 적합합니다.


10
없어요 실제로, 대 변형에 대해 보편적으로 사용되는 이름조차 없습니다 (배)
Daniel Gratzer

2
이것이 학교 과제 또는 시험에 대한 질문 인 경우, 우리가 아닌 교사 또는 교과서에서 답변을 받아야합니다. 그는 그것을 다른 것으로 부를지도 모른다. 교실에서 가르치는 것이 항상 현실 세계에서 일반적으로 사용되는 것은 아닙니다.
Robert Harvey

7
@RobertHarvey 이것은 시험 문제 (?) 또는 이와 유사한 것이 아닙니다. 프로그래머로서 프로그래밍 객체 (유형, 변수 등)에 적합한 이름을 선택하는 것이 매우 중요하다고 생각합니다. 그리고 무언가가 잘 알려진 이름을 가지고 있다면, 무지를 제외하고는 그것을 사용하지 않을 이유가 없습니다. 그것이 바로 질문입니다.
user40989

9
@Izkata 아니요, 맞지 않습니다. 고차 함수는 함수를 취하는 함수입니다. fold고차 함수입니다. 접는 논쟁은 단지 논쟁 일뿐입니다
Daniel Gratzer

1
@jozefg 의견의 두 번째 부분에 대한 답변입니다. 첫 번째 부분 (및 질문)은 Meta에 대한 내 게시물을 참조하십시오. 이를 절차 매개 변수라고합니다.
이즈 카타

답변:


8

@jozefg가 언급했듯이 이것에 대한 단일 답변이 있는지 모르겠습니다. 그리고 순전히 추측에서 나온 한 가지 가능한 설명은 다음과 같습니다.

- 나는 형 때문에 이유는 의심 (a -> b -> b)하스켈의foldr 예는, - 함께 올 수있는 모든 이름보다 더 의미가 있습니다. 이후 ab유형 매개 변수가 될 수있는 어떤 함수가 아니라 거의 아무것도 할 수 있습니다. 당신은 같은 이름으로 남겨 그래서 function, combiner, morphism,과 argument, 중 특히 의미가 없습니다있는. 짧고 산만하지 않은 이름을 사용할 수도 있습니다.

또 다른 예는 id :: a -> a함수입니다. 인수를 어떻게 호출해야합니까? 다시 말하지만 id의 유형은 인수 이름보다 설명 적이라고 생각 합니다.

그러나 나는 당신에게 동의합니다. 아마도 수학에서 일반적인 이름이 있어야 할 것 같습니다. 누군가가 나를 고칠 수 있기를 바랍니다.


실제 코드에서 그 이름의 몇 가지 예 :

하스켈의 도서관 , 그것은 대부분이라고 f(때로는 operator코멘트에) :

class Foldable t where
    -- | Map each element of the structure to a monoid,
    -- and combine the results.
    foldMap :: Monoid m => (a -> m) -> t a -> m
    foldMap f = foldr (mappend . f) mempty

    -- | Right-associative fold of a structure.
    --
    -- @'foldr' f z = 'Prelude.foldr' f z . 'toList'@
    foldr :: (a -> b -> b) -> b -> t a -> b
    foldr f z t = appEndo (foldMap (Endo . f) t) z

    -- | Right-associative fold of a structure, 
    -- but with strict application of the operator.
    foldr' :: (a -> b -> b) -> b -> t a -> b
    foldr' f z0 xs = foldl f' id xs z0
      where f' k x z = k $! f x z

    -- | Left-associative fold of a structure.
    --
    -- @'foldl' f z = 'Prelude.foldl' f z . 'toList'@
    foldl :: (a -> b -> a) -> a -> t b -> a
    foldl f z t = appEndo (getDual (foldMap (Dual . Endo . flip f) t)) z

    -- | Left-associative fold of a structure.
    -- but with strict application of the operator.
    --
    -- @'foldl' f z = 'List.foldl'' f z . 'toList'@
    foldl' :: (a -> b -> a) -> a -> t b -> a
    foldl' f z0 xs = foldr f' id xs z0
      where f' x k z = k $! f z x

    -- | A variant of 'foldr' that has no base case,
    -- and thus may only be applied to non-empty structures.
    --
    -- @'foldr1' f = 'Prelude.foldr1' f . 'toList'@
    foldr1 :: (a -> a -> a) -> t a -> a
    foldr1 f xs = fromMaybe (error "foldr1: empty structure")
                    (foldr mf Nothing xs)
      where
        mf x Nothing = Just x
        mf x (Just y) = Just (f x y)

    -- | A variant of 'foldl' that has no base case,
    -- and thus may only be applied to non-empty structures.
    --
    -- @'foldl1' f = 'Prelude.foldl1' f . 'toList'@
    foldl1 :: (a -> a -> a) -> t a -> a
    foldl1 f xs = fromMaybe (error "foldl1: empty structure")
                    (foldl mf Nothing xs)
      where
        mf Nothing y = Just y
        mf (Just x) y = Just (f x y)

-- instances for Prelude types

instance Foldable Maybe where
    foldr _ z Nothing = z
    foldr f z (Just x) = f x z

    foldl _ z Nothing = z
    foldl f z (Just x) = f z x

instance Ix i => Foldable (Array i) where
    foldr f z = Prelude.foldr f z . elems
    foldl f z = Prelude.foldl f z . elems
    foldr1 f = Prelude.foldr1 f . elems
    foldl1 f = Prelude.foldl1 f . elems

-- | Monadic fold over the elements of a structure,
-- associating to the right, i.e. from right to left.
foldrM :: (Foldable t, Monad m) => (a -> b -> m b) -> b -> t a -> m b
foldrM f z0 xs = foldl f' return xs z0
  where f' k x z = f x z >>= k

-- | Monadic fold over the elements of a structure,
-- associating to the left, i.e. from left to right.
foldlM :: (Foldable t, Monad m) => (a -> b -> m a) -> a -> t b -> m a
foldlM f z0 xs = foldr f' return xs z0
  where f' x k z = f z x >>= k

-- | Map each element of a structure to an action, evaluate
-- these actions from left to right, and ignore the results.
traverse_ :: (Foldable t, Applicative f) => (a -> f b) -> t a -> f ()
traverse_ f = foldr ((*>) . f) (pure ())

-- | Map each element of a structure to a monadic action, evaluate
-- these actions from left to right, and ignore the results.
mapM_ :: (Foldable t, Monad m) => (a -> m b) -> t a -> m ()
mapM_ f = foldr ((>>) . f) (return ())

f Clojure 에서도 호출 됩니다 .

(def
    ^{:arglists '([f coll] [f val coll])
      :doc "f should be a function of 2 arguments. If val is not supplied,
  returns the result of applying f to the first 2 items in coll, then
  applying f to that result and the 3rd item, etc. If coll contains no
  items, f must accept no arguments as well, and reduce returns the
  result of calling f with no arguments.  If coll has only 1 item, it
  is returned and f is not called.  If val is supplied, returns the
  result of applying f to val and the first item in coll, then
  applying f to that result and the 2nd item, etc. If coll contains no
  items, returns val and f is not called."
      :added "1.0"}    
    reduce
     (fn r
       ([f coll]
             (let [s (seq coll)]
               (if s
                 (r f (first s) (next s))
                 (f))))
       ([f val coll]
          (let [s (seq coll)]
            (if s
              (if (chunked-seq? s)
                (recur f 
                       (.reduce (chunk-first s) f val)
                       (chunk-next s))
                (recur f (f val (first s)) (next s)))
              val)))))

6

f의 함수 인수에 대한 나쁜 이름 이라는 생각에 동의하지 않습니다 fold. 프로그래밍에서 설명적인 이름을 원하는 이유는 이름이 무엇을 나타내는 지 알기 때문에 이름 f은 함수 (있는 그대로 gh)에 대해 수학 (및 함수형 프로그래밍 언어)에서 일반적으로 사용됩니다 .

우리는 f디자인 에 대해 거의 알지 못합니다 (더 구체적으로 설명하면 fold많은 것을 사용할 수 없기 때문에). 이름 f은 두 가지 인수의 함수라는 것을 제외하고 우리가 알아야 할 모든 것을 알려줍니다. 이름 f은 영어로 발음되는 대명사 'it'과 매우 흡사합니다. 거의 모든 것을 의미 할 수있는 자리 표시 자입니다. 우리는 문장에서 그것을 사용할 때까지 '그것'이 무엇인지 알지 못하며, 우리 f가 전화 할 때까지는 무엇인지 모른다 fold.

사물의 이름을 지정할 때 가능한 한 많은 정보를 이름에서 얻고 자하며, 중요한 정보를 희생하지 않고 정보를 얻을 수 있다면 이름을 짧게하는 것을 선호합니다. 여기에 우리가 알고있는 거의 모든 것을 알려주 는 매우 짧은 이름이 있습니다. 나는 그것이 향상 될 수 있다고 생각하지 않습니다.

명령형 프로그래밍에서 i루프 카운터로 사용됩니다 (있는 경우 jk더 필요한 경우). 함수형 프로그래밍 f에서 고차 함수의 함수 인수에 사용됩니다 ( 더 필요한 경우 gh). 나는 f / g / h 규약이 i / j / k 규약과 같이 잘 확립되어 있는지 확인하기 위해 기능적 언어에 대한 충분한 경험이 없지만, 그렇지 않다면, 나는 그것이 있어야한다고 생각합니다 (확실히 수학에서 확립).


3

나는 대명사가 아닌 다른 들었으니이 가장 일반적인 이름 fbinary operation또는 binary function- 그보다 더 구체적되고의 문제는 그대로 할 수있다 아무것도 , 사람들이 유형 서명을 고수하는 이유의 그 a -> b -> a(또는 a -> b -> b그것은 바로 배 않은 경우) .

난 당신이 특정 유형의 서명이 이름을 가지고 다행히 것을, 유형 서명에 정확히, 스틱을 할 것을 제안한다 그래서 : binary function,처럼 a -> aA는 unary operation, 및 a -> b이다 unary function, 당신은 호출 할 수 있습니다 와 을 .a -> a -> abinary operationa -> b -> cbinary function


1
binary operation에게 더 의미 a -> a -> a있고 의미 binary function할 것입니다 a -> b -> c... 진실은 분명히 사이에 있습니다. :-)
user40989

@ user40989 좋은 전화, 수정되었습니다.
Jimmy Hoffa

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.