gpt4 book ai didi

haskell - SPECIALIZE 编译用语的误解

转载 作者:行者123 更新时间:2023-12-04 06:53:44 24 4
gpt4 key购买 nike

SPECIALIZE 的目的pragma 是创建更具体的函数版本。

我有一个功能

adaptBlocks :: Int -> BlocksField a -> Maybe (BlocksField a)

我将其专门化如下:
{-# SPECIALIZE NOINLINE
adaptBlocks :: Int -> BlocksField Element -> Maybe (BlocksField Element) #-}

但是编译器给了我这个令人困惑的警告:

SPECIALISE pragma for non-overloaded function ‘adaptBlocks’

怎么了?

最佳答案

特化适用于有界多态性,其中类型变量如 a受到限制,例如

foo :: (Eq a, Num a) => a -> a -> a
foo x y | x == y = 2*x
| otherwise = 3*y

在这里,专攻 a ~ Int允许编译器内联 Int (==),(*) 的版本,提高效率。请注意,这些函数由上下文 (Eq a, Num a) 提供。 .

在您的情况下,没有限制 a 的上下文,因此无法执行此优化。毕竟你的多态代码不能使用 (*)Int 上的任何其他数值函数,因为为了编译,你的代码必须处理任何类型 a ,包括那些不是数字的。

关于haskell - SPECIALIZE 编译用语的误解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47079549/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com