假设我有一个列表fns
的从部分功能a
到b
,我所代表的功能从a
到Maybe b
,并且我有一个对象x
类型的a
.假设现在我要定义另一个函数从a
到Maybe b
这需要第一的价值f x
,是不是Nothing
,如果这样的f
存在fns
,或价值Nothing
,如果没有这样的f
存在.所以基本上它f x
是第一个f
有效的输出,或者Nothing
如果没有f
效果.
提出一些能够完成这项工作的代码并不难.例如,可以创建一个列表从中[f x| f <- fns]
删除所有Nothing
s,然后取结果列表的头部,或者Nothing
如果该列表为空.但这感觉很笨拙,这似乎是一种普遍的情况,在Haskell中使用一些内置函数可以实现更加时尚的实现.如果是这样,那么我有兴趣知道它是什么.
我是Haskell的新手.我试图在Haskell中创建一个迷你语言,并希望尽可能使用一个高阶函数opp
(简称为"对立")将一些熟悉的函数转换为明显的对立面.例如,opp succ
将是函数pred
,opp head
将是last
,等等.我没有一些关于将函数转换为相反函数的含义的一般定义:我只想选择几个关键示例并声明它们的对立面.所以我想要一个几乎没有定义的高度多态函数.
困难似乎是我想通过他们的名字而不是他们的本质来识别这些功能(可以这么说).这种困难的一个表现就是如果我写的话
opp succ = pred
然后Haskell视为succ
一个变量,因此给了我一个始终取值的常数函数pred
.我真正想要的是说更多的话,"如果你看到这个字符串,opp succ
那么就把它想象成另一个名字pred
." 但经过一段时间的搜索,我无法找到如何做到这一点(如果可能的话).
总而言之,我想定义一个函数
opp :: (a -> b) -> (a -> b)
通过说出类似的话
opp succ = pred
opp pred = succ
opp head = last
opp last = head
并在我想要的时候添加到此列表中.显然我不能这样做,但有一些非可怕的方法来达到同样的效果吗?
我希望能够在Haskell中做些什么,但是如果可能的话,这一点并不明显.我是一个新手(例如,我还不了解monad),所以也许有一些先进的方法.
假设我已经将某个类型的函数f定义为自身.我希望能够定义一个概念"prev",它代表列表中的前一个元素(给定类型的元素).所以我想像[x,y,f prev]这样的意思是[x,y,fy].我不介意定义是否涉及用自然数字压缩列表,只要我最后编写的内容可以隐藏构造方法.
这可能是不可能的一个原因是,如果可能的话,那么人们也应该能够定义"下一个"的概念,并且人们不希望能够写出[f next,g prev].如果不可能,还有下一个最佳选择吗?
具体来说,我想要做的是为每个正整数n定义级别为n的列表的类型.我的意思是看起来有点像这样(但可能不完全是).首先,对于任何类型的a
让List a
是[a]
.(我知道怎么做.)现在我想
IteratedList 0 a = a
IteratedList n a = List (IteratedList (n-1) a)
所以,例如,IteratedList 3 a
将是[[[a]]]
.
我想要这个的原因是我想编写一个解析器,它可以通过识别开括号,挑出一堆级别为n-1的列表,然后识别结束括号来挑选级别n的列表.但我不知道如何为解析器做出适当的类型声明.
也许我会以错误的方式处理事情.如果是这样,那么正确的方法是什么?
稍后补充.非常感谢下面的有用答案.最后,由(i)难以使用嵌套列表概念之类的东西和(ii)nm的评论表明我几乎肯定不需要使用一个(我怀疑的一半),我意识到我可以通过简单的方式实现我的解析器所需的功能,确实不需要嵌套列表的类型.有用的经验教训.
haskell ×4