小编use*_*553的帖子

如何应用在Haskell中工作的第一个部分函数?

假设我有一个列表fns的从部分功能ab,我所代表的功能从aMaybe b,并且我有一个对象x类型的a.假设现在我要定义另一个函数从aMaybe b这需要第一的价值f x,是不是Nothing,如果这样的f存在fns,或价值Nothing,如果没有这样的f存在.所以基本上它f x是第一个f有效的输出,或者Nothing如果没有f效果.

提出一些能够完成这项工作的代码并不难.例如,可以创建一个列表从中[f x| f <- fns]删除所有Nothings,然后取结果列表的头部,或者Nothing如果该列表为空.但这感觉很笨拙,这似乎是一种普遍的情况,在Haskell中使用一些内置函数可以实现更加时尚的实现.如果是这样,那么我有兴趣知道它是什么.

haskell

9
推荐指数
2
解决办法
629
查看次数

是否有可能根据具体情况定义更高阶的"相反"函数?

我是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

7
推荐指数
2
解决办法
328
查看次数

参考Haskell列表中的上一个术语

我希望能够在Haskell中做些什么,但是如果可能的话,这一点并不明显.我是一个新手(例如,我还不了解monad),所以也许有一些先进的方法.

假设我已经将某个类型的函数f定义为自身.我希望能够定义一个概念"prev",它代表列表中的前一个元素(给定类型的元素).所以我想像[x,y,f prev]这样的意思是[x,y,fy].我不介意定义是否涉及用自然数字压缩列表,只要我最后编写的内容可以隐藏构造方法.

这可能是不可能的一个原因是,如果可能的话,那么人们也应该能够定义"下一个"的概念,并且人们不希望能够写出[f next,g prev].如果不可能,还有下一个最佳选择吗?

haskell

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

如何在Haskell中递归定义一系列类型?

具体来说,我想要做的是为每个正整数n定义级别为n的列表的类型.我的意思是看起来有点像这样(但可能不完全是).首先,对于任何类型的aList 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

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

标签 统计

haskell ×4