由买买提看人间百态

topics

全部话题 - 话题: emptytree
(共0页)
a*****e
发帖数: 1700
1
来自主题: Programming版 - haskell怎么调试好?
你是用的哪个 GHC? 我在 7.4.1 和 7.8.3 都试了,正常啊?
Prelude> data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show)
Prelude> :t EmptyTree
EmptyTree :: Tree a
Prelude> show EmptyTree
"EmptyTree"
Prelude> let test = show EmptyTree
Prelude> test
"EmptyTree"
p*****2
发帖数: 21240
2
来自主题: Programming版 - haskell怎么调试好?
大牛看看为什么hs推断不出来类型?
data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show)
test = show EmptyTree
No instance for (Show a0) arising from a use of ???show???
The type variable ???a0??? is ambiguous
Note: there are several potential instances:
instance Show a => Show (Tree a)
-- Defined at /Users/gzhao/Documents/workspace/hsTest2/src/Tree.hs:3
:62
instance Show Double -- Defined in ???GHC.Float???
instance Show Float -- Defined in ???GHC.Float???
..... 阅读全帖
a*****e
发帖数: 1700
3
来自主题: Programming版 - haskell怎么调试好?
你写成:
test = show (EmptyTree :: Tree ())
就可以编译通过。这个类型错误的原因是,如果不加类型注释,那么推导出来的是
test = show (EmptyTree :: Show a => Tree a) :: String
这个编译通不过,是因为类型变量 a 不是一个 concrete type,且最终的 test 类型
里不包含这个变量。简单的解决方法就是任选一个满足 Show a 的 concrete type,比
如 () 类型。要么程序员把这个选择写出来,要么编译器替你挑一个。在 type class
的声明里面可以用 default 关键字来注明这个选择,但显然 Show 这个 class 里面没
有提供这样的 default。所以原程序编译通不过。
至于为什么在 GHCi 里面直接敲进去反而可以了,我也很奇怪... 已经帮你去问了。
a*****e
发帖数: 1700
4
来自主题: Programming版 - haskell怎么调试好?

我做编译器相关工作,有时会用到 Haskell。
你如果用 deriving Show,那么会自动生成 Show a => Show (Tree a) 的 instance.
如果你想直接在类型上限定,可以写成:
data Tree a where
EmptyTree :: Tree a
Node :: a -> Tree a -> Tree a
这种写法和上面写法等价,是引入 GADT 之后加入的语法。然后,要做 Show a 的限制
就很简单了:
data Tree a where
EmptyTree :: Show a => Tree a
Node :: Show a => a -> Tree a -> Tree a
之前你遇到那个类型错误,询问结果是,可以用 {-# LANGUAGE ExtendedDefaultRules
#-} 来规避。详见
https://www.haskell.org/ghc/docs/7.8.3/html/users_guide/interactive-
evaluation.html#extended-de... 阅读全帖
d******e
发帖数: 2265
5
来自主题: Programming版 - Clojure上手123
常人表示看不懂。
来段scala
sealed trait Tree[+A]
case object EmptyTree extends Tree[Nothing]
case class Node[A](value: A , left: Tree[A], right: Tree[A]) extends Tree[A]
def fold[A, B](t:Tree[A] , z:B)(f:(B,A,B) => B): B = t match {
case EmptyTree => z
case Node(x,l,r) => f ( fold( l , z )(f) , x , fold( r , z )(f) )
}
def size[T] (tree: Tree[T]) =
fold(tree, 0: Int){(l,x,r) => l + r + 1}
这个要是去面试,估计对面的看了要怒了。
p*****2
发帖数: 21240
6
来自主题: Programming版 - haskell怎么调试好?

class
多谢大牛。大牛是用Haskell在工作上,还是自己玩呢?
另外 下边的类型定义,可以限定 a 是 Show 吗? 我翻了书,没找到相关语法。
data Tree a = EmptyTree | Node a (Tree a) (Tree a)
(共0页)