为什么可以在Haskell中创建这样的列表:
slist = [ [], [[]], [[],[[]]] ]
Run Code Online (Sandbox Code Playgroud)
据我所知,每个元素在这里都有各种类型(如数学:Ø,{Ø}等).而且ghci说:
> :t []
[] :: [t]
> :t [[]]
[[]] :: [[t]]
Run Code Online (Sandbox Code Playgroud)
正式地,我看到了不同的音符.
换句话说,第一个元素是一个简单的空列表,第二个元素是列表(!)等等.
怎么了?为什么Haskell认为它们是同一类型?
我收到了这个警告
ignoring (possibly broken) abi-depends field for packages
Run Code Online (Sandbox Code Playgroud)
当cabal build我的小项目运行时.这是什么意思?当我平常使用时,我ghc -O2 mylib.lhs没有这样的警告,为什么?
在Windows 7 64位上使用ghc 8.4.3的Haskell平台
在"对Haskell的温和介绍"中,我们有Tree类型的声明:
data Tree a = Leaf a | Branch (Tree a) (Tree a)
deriving (Eq,Ord,Show,Read)
Run Code Online (Sandbox Code Playgroud)
让我们来做一些这种类型的值:
a1 = Leaf 1
a2 = Leaf 2
a3 = Leaf 3
a4 = a1 `Branch` a2
a5 = a2 `Branch` a3
a6 = a4 `Branch` a5
Run Code Online (Sandbox Code Playgroud)
在ghci:
*Main> :t a6
a6 :: Tree Integer
Run Code Online (Sandbox Code Playgroud)
但a6根本不是树,请参阅:
a6
/ \
a4 a5
/ \ / \
a1 a2 a3
Run Code Online (Sandbox Code Playgroud)
这个图表中有一个循环!怎么了?树的类型定义是否正确?或许,我不能在理解这个例子时遇到一些错误......
有一个著名的类型级自然数示例:
data Zero
data Succ n
Run Code Online (Sandbox Code Playgroud)
当我们应用类型构造函数时,我有一个关于理想限制的问题Succ。例如,如果要对函数定义进行此类限制,则可以使用类和上下文,如以下代码所示:
class Nat n where
toInt :: n -> Int
instance Nat Zero where
toInt _ = 0
instance (Nat n) => Nat (Succ n) where
toInt _ = 1 + toInt (undefined :: n)
Run Code Online (Sandbox Code Playgroud)
不可能使用toInt (undefined :: Succ Int),没关系。
但是如何实现对类型级别构造的类似限制(也许带有一些高级类型扩展)?
例如,我Succ只允许将类型构造函数与类型Zero和某些东西一起使用,例如:Succ (Succ Zero),Succ (Succ (Succ Zero))等等。如何避免在编译时出现此类不良示例:
type Test = Succ Int
Run Code Online (Sandbox Code Playgroud)
(目前,没有编译错误)
PS:对我来说更有趣的是如何对最后一个示例的类型声明创建限制
我想制作不同类型的嵌套applicative functor.例如,不同类型的嵌套简单仿函数(在ghci中)可以正常工作:
Prelude> ((+2) <$>) <$> (Just [1..4])
Just [3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
但对于不同类型的应用函子:
Prelude> ((*) <$>) <$> (Just [1,2,3]) <*> (Just [4,5,6,7])
<interactive>:56:1: error:
* Couldn't match type `[Integer -> Integer]' with `[Integer] -> b'
Run Code Online (Sandbox Code Playgroud)
不工作!我想获得这样的东西:
Just [4,5,6,7,8,10,12,14,12,15,18,21]
Run Code Online (Sandbox Code Playgroud)
我知道应用仿函数在仿函数和monad之间具有中间位置.在关于monad变形金刚的话题之前,我可以看到这个练习是初步的.
haskell ×5
types ×2
applicative ×1
binary-tree ×1
cabal ×1
data-kinds ×1
functor ×1
gadt ×1
ghc ×1
graph-theory ×1
list ×1
type-systems ×1