haskell - 纯 Haskell Lambda 微积分中列表的仿函数性

标签 haskell lambda functor lambda-calculus parametric-polymorphism

我正在尝试使用 Haskell 在纯 lambda 演算中实现各种功能。 一切正常

{-# LANGUAGE RankNTypes #-}

type List a = forall b. (a -> b -> b) -> b -> b

empty :: List a
empty = const id

cons :: a -> List a -> List a
cons x xs f y = f x (xs f y)

直到 Listmap 出现。

map :: (a -> b) -> List a -> List b
map f xs = xs (cons . f) empty

导致此错误消息:

• Couldn't match type ‘List b’ with ‘(b -> b1 -> b1) -> b1 -> b1’
  Expected type: b
                 -> ((b -> b1 -> b1) -> b1 -> b1) -> (b -> b1 -> b1) -> b1 -> b1
    Actual type: b -> List b -> List b
• In the first argument of ‘(.)’, namely ‘cons’
  In the first argument of ‘xs’, namely ‘(cons . f)’
  In the expression: xs (cons . f) empty
• Relevant bindings include
    f :: a -> b (bound at Basic.hs:12:5)
    map :: (a -> b) -> List a -> List b (bound at Basic.hs:12:1)

为什么 cons 有效而 map 无效?难道 List 的每个实例都适用于 b 的每个值,因为它受 forall 约束吗?

最佳答案

Haskell 的类型系统不够强大,无法像您那样编写 map。改为这样写:

map f xs c n = xs (c . f) n

关于haskell - 纯 Haskell Lambda 微积分中列表的仿函数性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61980228/

相关文章:

haskell - 如何实现 'ex::Maybe [[Maybe a]] -> [[a]] '方法

loops - 遍历 Haskell 中的两个变量

haskell - 是否可以在 Haskell 中使用自己的语法糖(如 do 表示法或箭头表示法)?

java - 在 Java 8 中使用单个函数替换多个字符串

haskell - 如何使 Either 成为第二种类型的仿函数

haskell - 理解sum函数的实现

c# - 动态 Lambda 表达式构建器在枚举时崩溃

c# - Lambda "if"语句?

haskell - "No instance for (Ord k)"在 Data.Map.Map 上实现 Functor 时

C++ - 将对象(如字符串)映射到表中的成员函数的正确方法