gpt4 book ai didi

haskell - 尝试创建一个将另一个函数映射到函数列表的函数

转载 作者:行者123 更新时间:2023-12-02 02:08:02 26 4
gpt4 key购买 nike

compose :: [(u -> t)] -> ((u -> t) -> (u->y)) -> [(u->y)] 
compose [] _ = []
compose l f = map f l

我正在尝试创建一个函数,该函数接收函数列表并将另一个函数映射到该列表的元素。

示例:撰写 [(+2),(+3)] (+1) = [(+3),(+4)]

这就是当我尝试运行此代码时控制台向我显示的消息

*Main>(撰写 [(+2)] (+1))

:77:2: 没有因使用“print”而产生 (Show (t0 -> t0)) 的实例 在交互式 GHCi 命令的 stmt 中:打印它*主要>

最佳答案

没有一种方法可以智能地将函数转换为字符串,这就是您在此处看到的错误消息所说的内容。函数没有 Show 实例,您需要一个 Show 实例才能在 GHCi 中查看输出。当您在 Haskell 中创建函数时,编译器会将其转换为低级命令,您不会在元数据或任何内容中保留原始函数定义。您将看不到 (+1) 。 (+2) 变成 (+3),这不是 Haskell 函数的工作方式。

相反,您可以将其分配给一个名称:

> let fs = compose [(+2)] (+1)

然后对其应用值

> map ($ 10) fs
[13]

如果您希望能够将 (+2)(+1) 等内容转换为 (+3),您可以需要创建您自己的数据类型。这意味着您可以表示的函数的功能受到严重限制,除非您定义非常通用的行为。对于 Int 上的简单函数,您可以这样做

data ArithFunc
= Add Int
| Subtract Int
| Multiply Int
| ModBy Int
| Abs
| Negate
| Compose ArithFunc ArithFunc
deriving (Eq, Show)

然后您可以编写自定义组合运算符:

toFunction :: ArithFunc -> (Int -> Int)
toFunction (Add x) = (+x)
toFunction (Subtract x) = subtract x
toFunction (Multiply x) = (*x)
toFunction (ModBy x) = (`mod` x)
toFunction Abs = abs
toFunction Negate = negate
toFunction (Compose f1 f2) = toFunction f1 . toFunction f2

infixr 9 #
(#) :: ArithFunc -> ArithFunc -> ArithFunc
f1 # f2 = simplify $ Compose f1 f2

infixr 0 $$
($$) :: ArithFunc -> Int -> Int
f $$ x = toFunction f x

simplify (Compose (Add x) (Add y)) = Add (x + y)
simplify (Compose (Add x) (Subtract y)) = Add (x - y)
-- Continue adding simplification rules as desired

compose :: [ArithFunc] -> (ArithFunc -> ArithFunc) -> [ArithFunc]
compose l f = map (simplify . f) l

然后你可以写

> compose [Add 2] (Add 1)
[Add 3]
> map ($$ 10) $ compose [Add 2] (Add 1)
[13]

这个解决方案还远未完成,您确实需要以这样的方式定义 simplify ,使其继续简化嵌套的 Compose 构造,直到没有任何更改为止制定后,需要更多的简化规则,还有可以表示的其他操作,导致需要更多的简化规则,等等。上面的所有工作只是通过一组有限的 Int 数值计算来完成这类事情,想象一下将其扩展为适用于所有类型。这就是为什么 Haskell 选择一种更简单的方法来存储函数定义而不是字面上的意思,也是为什么你不能显示函数的原因。

关于haskell - 尝试创建一个将另一个函数映射到函数列表的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29610242/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com