2010-12-16 69 views
6

我有这段代码:SML列表平等奇怪

fun foldr2(f, x::xs) = 
    if xs = [] then 
     x 
    else 
     f(x, foldr2(f, xs)) 

随着类型签名

(''a * ''a -> ''a) * ''a list -> ''a 

看起来相当直接的,它需要的是工作在平等类型和列表的功能由于xs = []的比较,所以作为参数的平等类型。但是,由于某种原因,它在输入上起作用,如(op +, [2.3, 2.7, 4.0]),当在SML/NJ reals不是一个相等类型。任何人都可以帮助我了解为什么发生这种魔术?

+1

+1,我也想知道为什么这个工程。就好像SML/NJ将条件块翻译为“无效[2.3,2.7,4.0]”或类似。 – 2010-12-16 20:03:04

回答

2

我相信这是与+重载为实际的神奇方式。对我来说,这个差不多是是一个编译器错误,尽管我不得不看看SML97的定义来确切地知道什么是正确的行为。在SML,恕我直言,超过+是一个讨厌的黑暗角落。

例如,如果你定义一个函数,real * real -> real型的,并传递作为参数传递给foldr2你的类型的错误你期待:

fun f (x : real * real) = 134.5 
foldr2 (f, [1.4, 2.25, 7.0]) 
    stdIn:8.1-8.29 Error: operator and operand don't agree [equality type required] 

可以,即使你诱导型错误只需在op +中添加一个类型注释,这基本上导致了我的结论,那就是导致神秘效应的+的重载。