小编Vla*_*mir的帖子

Haskell中嵌套空列表的列表

为什么可以在Haskell中创建这样的列表:

slist = [ [], [[]], [[],[[]]] ]
Run Code Online (Sandbox Code Playgroud)

据我所知,每个元素在这里都有各种类型(如数学:Ø,{Ø}等).而且ghci说:

> :t []
[] :: [t]
> :t [[]]
[[]] :: [[t]]
Run Code Online (Sandbox Code Playgroud)

正式地,我看到了不同的音符.

换句话说,第一个元素是一个简单的空列表,第二个元素是列表(!)等等.

怎么了?为什么Haskell认为它们是同一类型?

haskell types list

12
推荐指数
2
解决办法
419
查看次数

"无视(可能已损坏)abi-取决于包裹的字段"是什么意思?

我收到了这个警告

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 ghc cabal

6
推荐指数
1
解决办法
124
查看次数

树与否(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)

这个图表中有一个循环!怎么了?树的类型定义是否正确?或许,我不能在理解这个例子时遇到一些错误......

binary-tree haskell types graph-theory

4
推荐指数
2
解决办法
110
查看次数

类型声明中的类型限制

有一个著名的类型级自然数示例:

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:对我来说更有趣的是如何对最后一个示例的类型声明创建限制

haskell type-systems gadt phantom-types data-kinds

3
推荐指数
1
解决办法
107
查看次数

Haskell中不同类型的嵌套应用函子

我想制作不同类型的嵌套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 functor monad-transformers applicative

2
推荐指数
1
解决办法
169
查看次数