相关疑难解决方法(0)

在Haskell中出现故障

在Haskell中是否有一个优雅的表示法来理解函数的参数?

例如,如果您希望将2除以列表的所有元素,则可以编写

map ((/) 2) [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

但是,为了划分列表的所有元素,您似乎需要定义匿名函数

map (\x -> x/2) [1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)

在更复杂的情况下,匿名函数很快变得难以处理.我知道在这种情况下map((*)0.5)[1,2,3,4,5]可以正常工作,但我很想知道Haskell是否有更优雅的方式来讨论函数的参数乱了?

haskell currying

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

切换Haskell中实例声明的参数顺序

我想创建一个实例声明,但free类型变量不是最后一个变量.例如,我有一个类声明

class Poppable m where
  tryPop :: m a -> Maybe (a, m a)
Run Code Online (Sandbox Code Playgroud)

现在我想让Q.PSQ(优先级队列)成为Poppable的一个实例.具体来说,我想要这样的东西:

instance (Ord p) => Poppable (\a -> Q.PSQ a p) where
  tryPop = fmap (first Q.key) . Q.minView
Run Code Online (Sandbox Code Playgroud)

但是,这不是合法的Haskell代码.如果切换到PSQ的参数顺序,那么我就没有问题了:

instance (Ord p) => Poppable (Q.PSQ p) where
  tryPop = fmap (first Q.key) . Q.minView
Run Code Online (Sandbox Code Playgroud)

如何切换实例声明的参数顺序?

现在我可以使用newtype包装PSQ:

newtype PSQ'' a b = PSQ'' (Q.PSQ b a)
Run Code Online (Sandbox Code Playgroud)

然而这对我来说似乎很笨重,因为我必须不断地包装/打开它.有没有更简单的方法?

*

我尝试使用数据/类型系列,但都给出了错误.

(1)使用数据族声明:

data family PSQ' a b
data instance PSQ' a b = PSQ b a
instance (Ord …
Run Code Online (Sandbox Code Playgroud)

haskell

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

标签 统计

haskell ×2

currying ×1