http://www.iai.uni-bonn.de/~jv/mpc08.pdf - 在本文中我无法理解以下声明:
instance TreeLike CTree where
...
abs :: CTree a -> Tree a
improve :: (forall m. TreeLike m => m a) -> Tree a
improve m = abs m
Run Code Online (Sandbox Code Playgroud)
差异(forall m.TreeLike m => ma)带来了(我认为TreeLike m => ma就足够了)
为什么它允许abs在这里,如果m in ma可以是任何TreeLike,而不仅仅是CTree?
我是Haskell的新手并拥有这段代码:
import Control.Monad
data NestedList a = Elem a | List [NestedList a] deriving (Show)
instance Monad NestedList where
return a = List [Elem a]
(List (Elem a: xs)) >>= f = let a' = f a in a' `joinLists` xs
func :: a -> NestedList a
func a = List ([Elem a] ++ [Elem a])
joinLists :: NestedList a -> [NestedList a] -> NestedList a
joinLists (List a) b = List (a ++ b)
main = do let a …Run Code Online (Sandbox Code Playgroud) 这是使路径归纳在Agda中起作用的后续问题
我想知道这个结构何时可能更具表现力.在我看来,我们总是这样表达:
f : forall {A} -> {x y : A} -> x == y -> "some type"
f refl = instance of "some type" for p == refl
Run Code Online (Sandbox Code Playgroud)
在这里,Agda将根据c : (x : A) -> C refl与该问题相同的示例进行路径归纳:
pathInd : forall {A} -> (C : {x y : A} -> x == y -> Set)
-> (c : (x : A) -> C refl)
-> {x y : A} -> (p : x == y) -> C …Run Code Online (Sandbox Code Playgroud) 是否有一个已经存在的实例,就像我在这篇博文中找到的那样?
data Reader r a = Reader (r -> a)
instance Functor (Reader r) where
fmap f (Reader x) = Reader (f . x)
instance Applicative (Reader r) where
pure x = Reader $ pure x
(Reader f) <*> (Reader x) = Reader (f <*> x)
Run Code Online (Sandbox Code Playgroud) 所以我在玩 Haskell 并注意到一些让我困惑的事情。我定义了一个复杂的浮点数据结构,并想在它上面使用比较运算符。最初我这样做了,效果很好:
data Cplx = Cplx Float Float deriving (Eq, Show)
instance Ord Cplx where
(<=) a b = (<=) (normCplx a) (normCplx b)
(>=) a b = (>=) (normCplx a) (normCplx b)
(<) a b = (<) (normCplx a) (normCplx b)
(>) a b = (>) (normCplx a) (normCplx b)
normCplx :: Cplx -> Float
normCplx (Cplx a1 a2) = sqrt( a1^2 + a2^2)
Run Code Online (Sandbox Code Playgroud)
但我也注意到刚刚声明:
data Cplx = Cplx Float Float deriving (Eq, Show)
instance Ord Cplx where …Run Code Online (Sandbox Code Playgroud) 函数从字节流中读取ID.它知道id的大小 - 可以是4或8个字节.如何使返回类型多态?
(伪代码:)
class (Integral a) => IdSize a where
size :: a -> Int
instance IdSize Int32 ...
instance IdSize Int64 ...
data Data = Data (Map (IdSize a) String)
readData :: Data (Map (IdSize a) String)
readId :: (forall a. IdSize a) => a -- kind of this, but not right
Run Code Online (Sandbox Code Playgroud)
这个readId需要来自调用者的IdSize实例,但调用者不知道大小.类似地,readData返回的Map需要是多态的,但调用者不知道实际的类型.使用Map的函数将知道该类型.
一段代码在这里:
-- transitivity
trans : {A : Set} {x y z : A} -> x == y -> y == z -> x == z
trans refl refl = refl
union-pair' : {A : Set} -> (m n : S {A}) -> (x : A) ->
(ismember (set-union (set-pair m n)) x) == (ismember (union m n) x)
union-pair' m n x with ismember m x | ismember n x | ismember (set-union (set-pair m n)) x
union-pair' : {A …Run Code Online (Sandbox Code Playgroud)