0

我是一个尝试学习函数式编程的初学者。

有没有办法匹配不同的标准(非用户定义)类型?

例如,如果函数的参数是一个元组,则添加它们,如果它只是一个 int,则使用 int:

form (x, y) = x + y
form any_num = any_num

这显然行不通,因为程序认为 any_num 只是任何元组,因此无法访问。

4

3 回答 3

4

您可以使用类型类来做到这一点。我们可以定义Formable具有form函数的类型类:

class Formable a where
    form :: a -> Int

对于整数,只需使用 int

instance Formable Int where
    form x = x

如果参数是元组,则将其参数相加。我将更进一步,(Int, Int)它的可成形实例不仅适用于元组,而且只要两者都适用,它可以适用于任何(a, b)元组abFormable

instance (Formable a, Formable b) => Formable (a, b) where
    form (a, b) = form a + form b

我们可以Formable以类似的方式为其他类型编写实例。就像汇总列表的元素一样

instance (Formable a) => Formable [a] where
    form = sum . map form

或总和的替代方案

instance (Formable a, Formable b) => Formable (Either a b) where
    form (Left a) = form a
    form (Right b) = form b

甚至Maybe,如果我们知道如何处理Nothing

instance (Formable a) => Formable (Maybe a) where
    form Nothing = 0
    form (Just a) = form a
于 2017-04-29T18:48:03.937 回答
1

我想你可以这样做;

form :: Either (Int,Int) Int -> Int

form (Left (n,m)) = n + m
form (Right n)    = n

>> form (Left (2,3))
>> 5
>> form (Right 7)
>> 7 
于 2017-04-29T18:46:12.610 回答
0

在 Miranda 中,函数必须是给定的类型。例如:

你的第一行:

form (x, y) = x + y

有类型:

form :: (num,num) -> num

有两种解决方案:

  1. 使用带有替代情况的抽象类型
  2. 使用动态 FP 语言(我喜欢 Erlang)。
于 2021-08-27T00:14:03.633 回答