You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:15:47