길이가 인 n 인리스트 L이리스트 J에 인터리브되고 길이가 n + 1 인 것으로 가정하십시오. J의 각 요소에 대해 L의 이웃 중 어느 것이 더 큰지 알고 싶습니다. 다음의 기능은 길이가, 그 입력으로 L 걸리고,리스트 K를 생성 N + 1은 K의 I에게 번째 요소 J.의 I th 요소의 원하는 이웃 같은 것을유형 시스템을 사용하여 출력 길이 대 입력리스트를 점검하십시오.
aux [] prev acc = prev:acc
aux (hd:tl) prev acc = aux tl hd ((max hd prev):acc)
expand row = reverse (aux row 0 [])
나는 (I 원래 OCaml로 쓴)이 함수의 결과의 길이는 입력의 길이에 1을 더한 것으로, 비공식적으로, 자신에게 증명할 수 있습니다. 하지만 나는 이 불변하는 타입 시스템을 통해 증명할 수 있다는 것에 관심이 있었기 때문에 하스켈 (나를위한 새로운 언어)에 건너 뛴 입니다.
* Could not deduce: (m1 :+: S (S m)) ~ S (m1 :+: S m)
from the context: n ~ S m1
bound by a pattern with constructor:
Cons :: forall a m. a -> List a m -> List a (S m),
in an equation for `aux'
at pyramid.hs:23:6-15
Expected type: List a (n :+: S m)
Actual type: List a (m1 :+: S (S m))
* In the expression: aux tl hd (Cons (max hd prev) acc)
In an equation for `aux':
aux (Cons hd tl) prev acc = aux tl hd (Cons (max hd prev) acc)
* Relevant bindings include
acc :: List a m (bound at pyramid.hs:23:23)
tl :: List a m1 (bound at pyramid.hs:23:14)
aux :: List a n -> a -> List a m -> List a (n :+: S m)
(bound at pyramid.hs:22:1)
내가가 필요한 것으로 보인다 :
이{-# LANGUAGE GADTs, TypeOperators, TypeFamilies #-}
data Z
data S n
type family (:+:) a b :: *
type instance (:+:) Z n = n
type instance (:+:) (S m) n = S (m :+: n)
-- A List of length 'n' holding values of type 'a'
data List a n where
Nil :: List a Z
Cons :: a -> List a m -> List a (S m)
aux :: List a n -> a -> List a m -> List a (n :+: (S m))
aux Nil prev acc = Cons prev acc
aux (Cons hd tl) prev acc = aux tl hd (Cons (max hd prev) acc)
그러나, 마지막 줄은 다음과 같은 오류가 발생합니다 : this previous answer의 도움으로, 나는 다음과 같은까지 얻을 수 있었다 컴파일러는 (x :+: (S y)) ~ S (x :+: y)
을 가르쳐야합니다. 이것이 가능한가?
또는이 유형의 시스템보다이 문제에 더 효과적인 도구가 있습니까?
'x'에 대한 유도로 증명하고 아마도 어딘가에 'x'에 대한 싱글 톤을 정의하고 사용하는 것이 필요해 보입니다. 또한이 기계류는 불행히도 런타임에 지워지지 않으므로 단일 'Refl'을 생성하기 위해서만 O (n) 단계를 낭비 할 것입니다. (나는 GHC가 이것을 언젠가 O (1)에 최적화 할 수 있길 바란다 ... :) – chi
@chi 이런 종류의 GHC 최적화를 여러 번 언급했는데 (나는 기억할 수있다.) 나는 그것이 존재했으면 좋겠다. 너무. 이미 알고있는 기존의 노력이 있습니까? – Alec
@Alec 내 장기간의 불평과 소원 때문에 유감 스럽다. 나는 그것을 도울 수 없다. 나는 GHC 개발을 따르고 있지 않기 때문에 그것에 대한 계획이 있는지 여부에 대해서는 언급 할 수 없다. – chi