能否在Haskell的let块内定义类型同义词?
你的写法不可行,问题出在两个地方:
1. 函数定义语法错误
fullName的写法不符合Haskell语法要求,你直接写了fullName = a ++ " " ++ b,但变量a和b没有被绑定为函数参数。正确的函数定义需要显式声明参数,改成下面这样即可:
fullName a b = a ++ " " ++ b
或者用匿名函数的写法:
fullName = \a b -> a ++ " " ++ b
2. let块内定义类型别名需要启用GHC扩展
标准Haskell不允许在let或where块内部定义type类型别名,要支持这种写法,你需要启用GHC的TypeSynonymLocalBindings扩展。
修正后的可运行代码
{-# LANGUAGE TypeSynonymLocalBindings #-} something :: String something = let type FirstName = String type LastName = String fullName :: FirstName -> LastName -> String fullName a b = a ++ " " ++ b in fullName "Haskell" "Curry"
无需扩展的替代写法
如果不想启用扩展,把类型别名移到let块外面也能达到同样效果:
type FirstName = String type LastName = String something :: String something = let fullName :: FirstName -> LastName -> String fullName a b = a ++ " " ++ b in fullName "Haskell" "Curry"
内容的提问来源于stack exchange,提问作者justaman
相关产品推荐
相关产品推荐

