【发布时间】:2014-01-30 20:27:31
【问题描述】:
假设我将二叉树的代数数据类型定义为:
data Tree a = Empty | Node a (Tree a) (Tree a)
为了构建树,我现在想定义一个函数 (-<) 以便我可以像这样创建树:
1-<(2,3) 1-<(2-<(3,4),5) 1-<(Empty,2-<(4,5))
1 1 1
/ \ / \ \
2 3 2 5 2
/ \ / \
3 4 4 5
这似乎是不可能的!我的理由是它必须具有类型签名a -> (a, a) -> Tree a)。然后我认为有可能将a 类型的东西解释为Tree b 用于其他类型b,或者,如果失败,则简单地解释为a。以同样的方式我试图定义
f :: a -> Int
f (Just _) = 1
f _ = 0
这将是一个函数,它告诉我一个值是否属于Maybe a 类型并且是否由Just 构造。但这不起作用——ghc 然后希望类型签名为Maybe a -> Int。
除非我不知道 Haskell 有什么特殊功能,否则我想要的都是不可能的。我现在的问题是:
- 是吗?还是我错过了什么?
- 什么是我想要的很好的近似值? (我想简洁,例如写
(Right 2 -<(Right 3, Left (Right 4 -<(Right 1, Right 5)))是没有解决办法的。)
附:我真的不知道如何命名这个问题。
【问题讨论】:
标签: haskell algebraic-data-types