gpt4 book ai didi

haskell - 超长方体的应用实例

转载 作者:行者123 更新时间:2023-12-04 23:40:31 24 4
gpt4 key购买 nike

我正在处理 extended abstract by Prof. J.Gibbons在 Haskell 中进行类似 APL 的编程。我坚持定义 Applicative超立方体数据类型的实例,尽管论文指出它是完全可行的。简化的例子是 as follows .

{-# LANGUAGE KindSignatures, GADTs, TypeFamilies, TypeOperators, MultiParamTypeClasses, DataKinds #-}

import Control.Applicative
import Data.Traversable (Traversable)

class (Applicative f, Traversable f) => Dim f

class Shapely (fs :: [* -> *])
instance Shapely '[]
instance (Dim f, Shapely fs) => Shapely (f ': fs)

-------------------------------------
-- Hypercuboid datatype
-------------------------------------
data Hyper :: [* -> *] -> * -> * where
Scalar :: a -> Hyper '[] a
Prism :: (Dim f, Shapely fs) =>
Hyper fs (f a) -> Hyper (f ': fs) a

instance Functor (Hyper fs) where
fmap f (Scalar a) = Scalar $ f a
fmap f (Prism p) = Prism $ fmap (fmap f) p

instance Applicative (Hyper fs) where
pure a = undefined
{- `pure a = Scalar a` gives:
Couldn't match type ‘fs’ with ‘'[]’
‘fs’ is a rigid type variable bound by
the instance declaration
Expected type: Hyper fs a
Actual type: Hyper '[] a
-}

回顾已知的 Applicative Vector n a 的实例类型(例如,按长度索引的列表)我试图考虑 purereplicate (给定值的 n 元复制)。但似乎这需要类型级别的大小写(例如 pure a = case fs of '[] -> Scalar a; (f ': gs) -> <something using the fact that Applicative f> ),据我所知,这在 Haskell 中不可用。

最佳答案

您可以为 Hyper '[] 定义单独的实例和 Hyper (f ': fs) (这是一种“类型级案例”。)

您不能定义单个实例 Applicative (Hyper fs)这会按照您的意愿行事,因为它会违反参数化。当然我可以定义 isScalar :: Hyper fs -> Bool以明显的方式;那么什么是isScalar (pure ()) ?

(在这里,您无论如何都无法定义单个实例 Applicative (Hyper fs),因为在 f 情况下您需要对 Hyper (f ': fs) 进行约束。)

关于haskell - 超长方体的应用实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38882950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com