相关疑难解决方法(0)

如何在Haskell中定义Lisp的应用?

不应该像Haskell这样的惰性语言允许这个定义,其中函数是curry?

apply f [] = f
apply f (x:xs) = apply (f x) xs
Run Code Online (Sandbox Code Playgroud)

它基本上是一个将给定函数应用于给定参数列表的函数,并且很容易在Lisp中完成.有没有解决方法?

haskell types type-inference currying variadic-functions

39
推荐指数
4
解决办法
2663
查看次数

Haskell中的多变量函数

在阅读了关于在Haskell中编写多变量函数的这篇文章后,我试着写一些自己的函数.

起初我以为我会尝试概括它 - 所以我可以通过折叠参数给出一个返回可变参数函数的函数.

{-# OPTIONS -fglasgow-exts #-}
module Collapse where
class Collapse a r | r -> a where
  collapse :: (a -> a -> a) -> a -> r
instance Collapse a a where
  collapse _ = id
instance (Collapse a r) => Collapse a (a -> r) where
  collapse f a a' = collapse f (f a a')
Run Code Online (Sandbox Code Playgroud)

但是,编译器不喜欢这样:

Collapse.hs:5:9:
    Functional dependencies conflict between instance declarations:
      instance Collapse a a -- Defined at …
Run Code Online (Sandbox Code Playgroud)

polymorphism haskell polyvariadic

15
推荐指数
2
解决办法
1681
查看次数

是否可以在Haskell中编码通用的"提升"功能?

我不是varargs的最大粉丝,但我一直认为applicative(f <$> x <*> y)和idiom([i| f x y |])样式都有太多的符号.我通常喜欢liftA2 f x y这样做,但我也认为A2有点难看.从这个问题,我已经了解到可以在Haskell中实现vararg函数.这样,是否可以使用相同的原理来实现提升功能,例如:

lift f a b == pure f <*> a <*> b
Run Code Online (Sandbox Code Playgroud)

我试过替换引用代码的+by <*>:

class Lift r where 
    lift :: a -> r

instance Lift a where
    lift = id

instance (Lift r) => Lift (a -> r) where
    lift x y = lift (x <*> y)
Run Code Online (Sandbox Code Playgroud)

但我无法让这些类型正确......

haskell typeclass applicative

12
推荐指数
2
解决办法
613
查看次数

是否可以在Haskell中部分应用第n个参数?

我很好奇是否可以编写一个函数apply_nth,它接受一个函数,一个参数的数量,以及该参数的值,然后返回一个新的,部分应用的函数.

我得到的感觉是,由于类型系统这是不可能的,但我无法得出令人满意的答案.我也无法想出一个工作型签名.

如果语言更松散,我想代码可能看起来像这样.

apply_nth f 0 x = f x
apply_nth f n x = \a -> apply_nth (f a) (n-1) x
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

haskell functional-programming generic-programming dependent-type

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