문제

POLAMODICETAGCODE와 같은 다형성 "상수"는 실제로 일정하지만 사전 인수의 기능이 아닙니다.따라서

를 정의하면
primes :: Num n => [n]
primes = ...
.

물론 나쁜 예에서는 여기에 다형성을 가지고있는 것이 좋은 이유가 없습니다 ... 내가 정말로 관심이있는 것은 전 세계적으로 무리적 다형성 기능을 모르겠다고 노력하는 것입니다.5 :: Num a => as.
그런 다음이 시퀀스는 성능 측면에서 쉽지 않은 다른 사이트의 호출간에 공유되지 않습니다.(Haskell Standard가 두려운 모르핑 제한으로 우리를 축복 한 주된 이유는 무엇입니까?)

공유를 시행하는 방법을 볼 수있는 유일한 방법은 제한 클래스의 모든 인스턴스에 대해 단조로운 "태그"를 가지고있는 것입니다.예를 들어.

erastothenes :: Num n => [n]
erastothenes = ...

class (Num n) => HasPrimes n where
  -- | @'primes' ≡ 'erastothenes'@
  primes :: [n]

integerPrimes :: [Integer]
integerPrimes = erastothenes

instance HasPrimes Integer where
  primes = integerPrimes
.

... 우아함 측면에서는 좋지 않습니다.

그러한 메모이션을 구현하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

ConstraintKindsExistentialQuantification (또는 GADTs)를 활성화하면 유형 클래스 사전을 재 알릴 수 있습니다.

{-# LANGUAGE ConstraintKinds, ExistentialQuantification #-}

data Dict a = a => Dict
.

이 작업을 시도하면

fibs :: Num n => [n]
fibs = 1 : 1 : zipWith (+) fibs (drop 1 fibs)

fibs' :: [Integer]
fibs' = fibs


fibsWithDict :: Dict (Num n) -> [n]
fibsWithDict Dict = fs
  where
    fs = 1 : 1 : zipWith (+) fs (drop 1 fs)

fibs'' :: [Integer]
fibs'' = fibsWithDict Dict
.

GHCI의

λ> :set +s
λ> 
λ> fibs !! 29
832040
(2.66 secs, 721235304 bytes)
λ> 
λ> fibs !! 29
832040
(2.52 secs, 714054736 bytes)
λ> 
λ> 
λ> fibs' !! 29
832040
(2.67 secs, 713510568 bytes)
λ> 
λ> fibs' !! 29
832040
(0.00 secs, 1034296 bytes)
λ> 
λ> 
λ> fibs'' !! 29
832040
(0.00 secs, 1032624 bytes)
.

그래서 fibs''는 즉시 메모하는 세 유일한 구현입니다.

Dict 생성자에서 패턴 일치를 일치시켜야합니다. 그렇지 않으면 n가 Per Num 인스턴스가 제한되지 않도록 오류가 발생합니다 (서명이 fibsWithDict :: a -> [n]였습니다).

fibsWithDict Dict가 당신이 던지는 모든 유형에서 즉시 메모하는 표현식이라고 생각할 수 있으므로 (Num의 인스턴스 인 경우). 예 :

λ> (fibsWithDict Dict !! 29) :: Double
832040.0
(0.00 secs, 1028384 bytes)
.

편집 :이 명시 적 사전 패스가 여기에 필요하지 않으며 로컬 바인딩으로 ScopedTypeVariables를 사용하여 암시 적으로 수행 할 수 있습니다.

{-# LANGUAGE ScopedTypeVariables #-}

fibsImplicitDict :: forall a. Num a => [a]
fibsImplicitDict
  = let fs :: [a]
        fs = 1 : 1 : zipWith (+) fs (drop 1 fs)
    in
    fs
.

(여기서 통찰력을 위해 Bennofs 덕분에!)

다른 팁

상당히 기술적 인 이유로 꽤 불가능합니다.유형 수업이 열려 있으므로 다형성 상수는 컴파일 할 때 필연적으로 "보십시오"가 제약 조건을 만족시킬 수 없으므로 많은 모르핑 성 썽크를 할당 할 수 없습니다.다른 쪽에서, 타입 클래스는 확실히 가능한 모든 상수를 볼 수있는 모든 상수를 볼 수 없기 때문에, 형태의 툴 킹스는 유형 클래스 사전에 할당 될 수 없다.

모르핑 썽크를 할당 할 유형을 명시 적으로 언급해야합니다.

Typeablen 제약 조건을 추가하고 모든 접지 유형 n에 대해 다른 메모 화 테이블을 사용해 낼 수 있습니다.아마도 Dynamic를 활용해야하며,이를 위해 많은 것을 많이 활용해야합니다.그것은 또한 조금 해상지도 느낀다.

종속적으로 입력 된 언어에서는 물론 cast에서 (n : Num) -> [n]가 필요하지 않은 맵 casts를 모델링 할 수 있습니다.어쩌면 그런 것과 같은 것과 같은 것으로 착용감을 착용 할 수 있고 일종의 일종의 일종의 일종을 시뮬레이션 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top