控制功能的优点

1 syntax haskell function arity

我正在阅读这个问题的答案:Haskell:两者之间的区别.(点)和$(美元符号)这个回复让我觉得很奇怪......他的意思是+没有输入?然后我尝试了:

((+) 1)
((+) 1 1)
((+) 1 1 1)
Run Code Online (Sandbox Code Playgroud)

哎呀......伤心的消息.但我确信我看到的函数可能看似随意或大量的论据,认为有人以a-> b-> c ...-> z的方式定义它们.必须有一些方法来处理它!我正在寻找的是像CL中的&rest或&optional.

ehi*_*ird 11

当然,你可以定义一个可变参数函数,有一些类型类hackery:1

{-# LANGUAGE TypeFamilies #-}

class Add r where
    add' :: (Integer -> Integer) -> r

instance Add Integer where
    add' k = k 0

instance (n ~ Integer, Add r) => Add (n -> r) where
    add' k m = add' (\n -> k (m+n))

add :: (Add r) => r
add = add' id
Run Code Online (Sandbox Code Playgroud)

所以:

GHCi> add 1 2 :: Integer
3
GHCi> add 1 2 3 :: Integer
6
Run Code Online (Sandbox Code Playgroud)

标准Text.Printf模块使用相同的技巧.通常避免使用它有两个原因:第一,它给你的类型可能很难处理,你经常需要指定一个明确的类型签名供你使用; 二,它真的是一个黑客,应该很少使用,如果有的话.printf必须采用任意数量的参数并且是多态的,所以它不能简单地采用列表,但是为了补充,你可以使用sum.

1语言扩展在这里并不是绝对必要的,但是它们使得使用更容易(没有它们,你必须在我给出的例子中明确指定每个参数的类型,例如add (1 :: Integer) (2 :: Integer) :: Integer).