haskell - 在 haskell 中给 `_` 一个类型签名

我想将 _coerce 相关联,但我无法为其提供类型签名。

有什么技巧可以解决这个问题吗?

import Data.Coerce

ok :: ()
ok =
  let a = _ "hi"
   in let a :: String = __ "Hi"
       in ()
  where
    _ = undefined
    __ :: Coercible a b => a -> b
    __ = coerce

ko =
  let a = _ "hi"
   in let a :: String = __ "Hi"
       in ()
  where
    __ = undefined
    _ :: Coercible a b => a -> b. -- Invalid type signature: _ :: ... Should be of form <variable> :: <type>parser
    _ = coerce

最佳答案

_ 是一个保留名称,不能重新定义。它可以在模式中用作通配符,例如

let (_,x) = ....           -- takes the second component
    (_,_,_,x,_) = ....     -- takes the fourth component
    _ = ....               -- does not bind any variable
in ....

与其他变量名不同,它可以在一个模式中出现多次。

它也可以用作:例如,

let a = _ "hi"

触发特殊错误

• Found hole: _ :: [Char] -> t
  Where: ‘t’ is a rigid type variable bound by
           the inferred type of a :: t

本质上,_ "hi" 要求编译器提供术语 t 应该在 hole _ 替换为 t

因此,您的ok esample 并不是真的OK,而是触发了上述特殊错误。

关于haskell - 在 haskell 中给 `_` 一个类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67572802/

相关文章:

bash - 在 bash 中按日期时间格式排序

c++ - 如何使函数能够接受原始指针作为迭代器?

python-3.x - DistutilsError : Could not find suita

kubernetes - 如何将 kubernetes 的一个 secret 值复制到同一 name

c++ - char a[n][m] 和 char a[][m] 有区别吗?

node.js - 如何使用 NestJS 为多个国家/地区编写调度程序 12 :00AM(will

c - 学习C——测试数据类型

sql - 在 AWS Athena 中添加截止日期列

visual-studio-code - 代码行数旁边的竖线是什么

javascript - 如何在一组 span 元素之后替换纯文本内容或文本节点?