【发布时间】:2011-01-05 03:26:29
【问题描述】:
所以,只是为了好玩,我一直在玩 Haskell 中的 CountedList 类型,使用 Peano 数 和smart constructors。
类型安全的head 和tail 对我来说真的很酷。
我认为我已经达到了我知道该怎么做的极限
{-# LANGUAGE EmptyDataDecls #-}
module CountedList (
Zero, Succ, CountedList,
toList, ofList,
empty, cons, uncons,
head, tail,
fmap, map, foldl, foldr, filter
) where
import qualified List (foldr, foldl, filter)
import Prelude hiding (map, head, foldl, foldr, tail, filter)
data Zero
data Succ n
data CountedList n a = CL [a]
toList :: CountedList n a -> [a]
toList (CL as) = as
ofList :: [a] -> CountedList n a
ofList [] = empty
ofList (a:as) = cons a $ ofList as
empty :: CountedList Zero a
empty = CL []
cons :: a -> CountedList n a -> CountedList (Succ n) a
cons a = CL . (a:) . toList
uncons :: CountedList (Succ n) a -> (a, CountedList n a)
uncons (CL (a:as)) = (a, CL as)
head :: CountedList (Succ n) a -> a
head = fst . uncons
tail :: CountedList (Succ n) a -> CountedList n a
tail = snd . uncons
instance Functor (CountedList n) where
fmap f = CL . fmap f . toList
map :: (a -> b) -> CountedList n a -> CountedList n b
map = fmap
foldl :: (a -> b -> a) -> a -> CountedList n b -> a
foldl f a = List.foldl f a . toList
foldr :: (a -> b -> b) -> b -> CountedList n a -> b
foldr f b = List.foldr f b . toList
filter :: (a -> Bool) -> CountedList n a -> CountedList m a
filter p = ofList . List.filter p . toList
(抱歉出现任何转录错误 - 我最初使用 Haskell 编译器编写此内容的机器目前已关闭)。
我所做的大部分编译都没有问题,但我遇到了ofList 和filter 的问题。我想我理解为什么 - 当我说 ofList :: [a] -> CountedList n a 时,我是在说 ofList :: forall n . [a] -> CountedList n a - 创建的列表可以是任何所需的计数类型。我想写的相当于伪类ofList :: exists n . [a] -> CountedList n a,但是不知道怎么写。
有没有一种解决方法可以让我像我想象的那样编写ofList 和filter 函数,或者我已经达到了我能做的极限?我有一种感觉,existential types 缺少一些技巧。
【问题讨论】:
-
我不知道为什么有人会否决这个问题。我赞成平衡。
-
看起来有人错误地点击了反对票并修复了它:目前没有反对票。
-
确实,我点击了手机上的错误按钮,然后失去了网络连接。我希望 Stack Overflow 能在不久的将来得到一个移动样式表(带有一些更大的箭头):-)
标签: haskell list existential-type