首页 > 解决方案 > 在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

标签: haskell

解决方案


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

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

本质上,当hole_ "hi"被替换为.t_t

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


推荐阅读