无法消除名称歧义:Prelude.List。++,Prelude.Strings。++错误在Idris

时间:2018-03-15 02:02:29

标签: functional-programming typeerror idris

目前我正在尝试创建一个采用类型的函数 (a - > a - > a)作为Idris中的参数,而右边的函数是idris的列表的++命令,遗憾的是我收到此错误

ListMonoid :( A:类型) - > RawMonoid ListMonoid A =(A **([],(++)))

当检查具有预期类型的​​ListMonoid的右侧时         RawMonoid

不能消除名称的歧义:Prelude.List。++,Prelude.Strings。++

Raw Monoid是下面的数据类型

RawMonoid:输入 RawMonoid =(M **(M,M - > M - > M)) infixl 6&

在我看来,它不知道使用哪种++,有没有办法在通话中指定这个?

1 个答案:

答案 0 :(得分:1)

您可以将引用限定为(++),例如

ListMonoid A = (A ** ([], List.(++)) )

还有with关键字,它将模块名称作为其第一个参数 - 它基本上意味着,"在下面的表达式中,首先查看此模块以解析名称&# 34;,例如

ListMonoid A = (A ** ([], with List (++)) )

但是,这些都会在代码中出现以下类型错误:

    Type mismatch between
            List a -> List a -> List a (Type of (++))
    and
            A -> A -> A (Expected type)

如果我写:

ListMonoid A = (List A ** ([], (++)) )

它可以根据周围的类型约束选择正确的(++)