不应该像Haskell这样的惰性语言允许这个定义,其中函数是curry?
apply f [] = f
apply f (x:xs) = apply (f x) xs
Run Code Online (Sandbox Code Playgroud)
它基本上是一个将给定函数应用于给定参数列表的函数,并且很容易在Lisp中完成.有没有解决方法?
在阅读了关于在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) 我不是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)
但我无法让这些类型正确......
我很好奇是否可以编写一个函数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