【发布时间】:2018-04-24 08:45:59
【问题描述】:
作为 Purescript 的新手,我很难弄清楚为什么以下代码(取自“PureScript By Example”)会如此工作:
> flip (\n s -> show n <> s) "Ten" 10
"10Ten"
这对我来说很有意义:flip 调用它的第一个参数(lambda 表达式),它的第二个和第三个参数以相反的顺序调用,因此产生了连接的字符串。
但我想知道为什么我们会通过这个 sn-p 得到以下响应:
> flip (\n s -> show n <> s) 10 "Ten"
Could not match type Int with type String
这是我的思路:运算符<> 实际上是Data.Semigroup.append 的简写,调用n 推导为String(Data.Semigroup 的一个实例)和s 推导为@987654329 @。那么为什么 <> 不能将 Int 附加到 String ? (我想是因为它是右关联的,但我不确定......)
【问题讨论】:
-
show n将n变成一个字符串。因此,<>运算符被解析为来自字符串的半群实例。它需要两个相同类型的参数,但在第二个示例中s是10,它不是字符串。 -
我不知道运算符优先级在这里是如何工作的。请参阅下面的答案和 cmets。
-
不错的一个!它与优先级无关,而与
flip的语义有关,它可以完成您手动执行的操作,即翻转给定函数的参数。因为你翻转了两次(一次使用 ˋflip,一次手动),你最终会得到一个 Int 字符串应该是......向 lambda 添加签名会更清楚。 -
但是如果操作符
<>优先于函数应用,那么函数体实际上就是show (n <> s),所以第一次调用也不会被编译,对吧?
标签: type-conversion purescript