Mai*_*tor 1 haskell types dependent-type
请注意以下Haskell术语:
callNTimes :: forall a . Int -> (a -> a) -> a -> a
callNTimes n f 0 = x
callNTimes n f x = f (callNTimes (n-1) f x)
firstOf :: ??????
firstOf n = callNTimes n (\ x y -> x)
Run Code Online (Sandbox Code Playgroud)
如果我们忽略这些类型并手动规范化函数,那么firstOf接收一个N然后N参数的函数会丢弃除第一个之外的所有函数并返回它.firstOf 3 10 20 30回报3.是否可以使用新的依赖类型功能在GHC 8.0中键入该功能?
我终于设法得到了一个工作版本 - 这不是你要求的,但它展示了我评论的内容,我认为它非常接近
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Variadic where
data Z a = Z
data S t a = S (t a)
class Var n where
type El n :: *
type Res n :: *
firstOf :: n -> El n -> Res n
instance Var (Z a) where
type El (Z a) = a
type Res (Z a) = a
firstOf Z a = a
instance (El (n a) ~ a, Var (n a)) => Var (S n a) where
type El (S n a) = a
type Res (S n a) = a -> Res (n a)
firstOf (S n) a _ = firstOf n a
Run Code Online (Sandbox Code Playgroud)
这里有一些例子:
?> firstOf Z 5
5
?> firstOf (S Z) 5 9
5
?> firstOf (S (S Z)) 5 8 9
5
?> firstOf (S (S Z)) "Hi" "World" "Uhu"
"Hi"
Run Code Online (Sandbox Code Playgroud)
如果您对我如何到达那里感兴趣,您可以查看编辑历史记录
S和Z作为穷人替代*用于类型级文字,你可以使用它firstOf (S (S Z)),你会希望要2个参数是等待3 -那是因为我开始与Z= 1个参数firstOf 3 10 20 30 = 3哪个不会做(这会给出10) - 这可能是类型级文字和明显的重载| 归档时间: |
|
| 查看次数: |
222 次 |
| 最近记录: |