함수형 프로그래밍의 차이점 목록


14

질문 오카 사키 이후 순수하게 기능적인 데이터 구조의 새로운 점은 무엇입니까? , 및 jbapple의 장대 한 답변은 함수 프로그래밍 (논리 프로그래밍과 달리)에서 차이점 목록을 사용하여 언급 한 것으로 최근에 관심을 보였습니다. 이로 인해 Haskell 의 차이점 목록 구현 을 찾을 수 있었습니다. 두 가지 질문이 있습니다 (StackExchange에서 두 가지 다른 질문을 해야하는 경우 용서하거나 수정하십시오).

간단한 질문은, Haskell 라이브러리에있는 것 외에 함수형 프로그래밍 및 / 또는 구현에서 차이점 목록에 대한 학문적 고려를 아는 사람이 있습니까? jbapple의 답변은 차이점 목록에 대한 인용을주지 않았습니다 (논리 프로그래밍의 차이점 목록은 지식과 주변에 어딘가에있는 몇 가지 소스에 있습니다). Haskell 구현을 찾기 전에 아이디어가 논리에서 함수형 프로그래밍으로 뛰어났다는 것을 알지 못했습니다. 물론 Haskell의 차이점 목록은 고차원 함수를 자연스럽게 사용하는 것으로 논리 프로그래밍의 기능과는 상당히 다르게 작동하지만 인터페이스는 확실히 유사합니다.

내가 묻고 싶었던 더 흥미로운 (그리고 훨씬 더 fuzzier-headed) 것은 앞서 언급 한 Haskell 차이점 목록 라이브러리에 대해 주장 된 점근 적 상한 이 정확하고 그럴듯한 지 여부입니다. 혼란은 게으름으로 인한 복잡성 추론에 대한 명백한 정보가 누락 되었기 때문에 발생할 수 있지만 큰 데이터 구조 (또는 클로저 형성 또는 변수 조회 또는 무언가 )를 대체하는 데 항상 일정한 시간이 걸리면 주장 된 경계가 나에게 의미가 있습니다. 아니면 "캐치"가 단순히 "헤드"및 "테일"의 실행 시간에 제한이 없다는 것이 그러한 연산이 임의의 지연된 계산 / 대체 더미를 통해 쟁기질을해야하기 때문일까요?


1
처음에는“기능적 프로그래밍 언어 (기능적 프로그래밍 언어가 아닌)”에 혼동되었지만“(논리적 프로그래밍 언어가 아닌)”를 쓰려고 했습니까?
Tsuyoshi Ito

오 죄송합니다. 그렇습니다. 이것이 바로 의미입니다. 이제 수정되었습니다.
Rob Simmons

두 번째 질문은 Stack Overflow에서 더 적절 해 보이지만 여기에 요청 했으므로 여기에 누군가 대답 할 수 있는지 기다리는 것이 좋습니다. 개인적으로 나는 소스 코드를 읽음으로써 주장 된 경계를 의심 할만한 이유를 찾을 수 없지만, 의심 할만한 이유를 따르지 않았으며, 뭔가 빠졌을 수도 있습니다.
Tsuyoshi Ito

답변:


9

아니면 "캐치"가 단순히 "헤드"및 "테일"의 실행 시간에 제한이 없다는 것이 그러한 연산이 임의의 지연된 계산 / 대체 더미를 통해 쟁기질을해야하기 때문일까요?

Θ(m)m

일부 필수 조작의 다음 비 기능화 된 버전에는 대한 게으름이 필요합니다.O(1) fromList

{-# LANGUAGE NoMonomorphismRestriction #-}

data DL a = Id
          | Cons a
          | Compose (DL a) (DL a)

fromList [] = Id
fromList (x:xs) = Compose (Cons x) (fromList xs)

toList x = help x []
    where help Id r = r
          help (Cons a) r = a:r
          help (Compose f g) r = help f $ help g r

empty = Id

singleton = Cons

cons x = append (singleton x)

append = Compose

snoc xs x = append xs (singleton x)

Θ(n)headtail[a] -> [a]toList


그래서 당신이 게으름에서 얻는 것은 목록의 꼬리를 두 번 요구 하는 것이 비싼 작업을 두 번 수행하지 않는다는 것입니다.
Rob Simmons

@Rob, 나는 당신이 그 말의 의미를 이해하지 못합니다.
jbapple

나는이 예제에 의해 (나쁘게) 만들려고했던 점이 생각된다고 생각한다. 나는 원래 목록에 물건을 반복적으로 "찍어"서 만든 엄청나게 긴 차이 목록 "xs"를 가지고있다. "head xs"를 처음 호출하면 지연된 계산을 수행하는 데 O (n) 시간이 걸릴 것으로 예상합니다. 그러나 계산이 기억되어야하기 때문에 "head xs"에 대한 두 번째 호출 ( 같은 "xs"에 대한)은 O (1) 시간이 걸립니다.
Rob Simmons

1
글쎄, 나는 그것에 동의하지만 내 대답에서 언급 한 게으름은 snoc이나 머리에는 사용되지 않는 fromList에 관한 것입니다. 그래서, 그대로 그대로, 나는 "당신이 게으름에서 얻는 것"이라는 진술에서 "무엇"에 혼란 스러웠습니다. 나는 당신의 모범과 나의 것이 게으름에서 얻는 가지 라고 말하고 싶습니다 .
jbapple

그래, 그 설명은 당신의 이전 요점을 더 잘 이해하는 데 도움이됩니다.
Rob Simmons

12

네, 한계는 함수 구성에 일정한 시간이 걸린다는 가정에 달려 있습니다. 기본적으로 조인 목록이있는 경우 :

datatype 'a join = Nil | Cons of 'a * 'a join | Join of 'a join * 'a join

연결은 일정한 시간이며 임이 분명합니다.O(n) 이것을 cons-list로 바꾸는 것은 합니다. 일반적인 클로저 표현을 생각하면 이것이 기본적으로 데이터 유형의 일반적인 표현과 동일한 포인터 표현임을 알 수 있습니다. 또는이 유형을 비 기능화 된 차이 목록으로 볼 수 있습니다.

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